On Sun, Nov 12, 2006 at 03:42:30PM +0100, Giorgos Keramidas wrote: > On 2006-11-12 17:00, Ruslan Ermilov <ru_at_freebsd.org> wrote: > > > /src/lib/libelf/elf_rand.c: In function `elf_rand': > > > /src/lib/libelf/elf_rand.c:47: warning: cast increases required alignment of target type > > > *** Error code 1 > > > > > > Stop in /src/lib/libelf. > > > *** Error code 1 > > > > This looks like a GCC bug to me. The following code snippet, > > when compiled on FreeBSD/arm, causes a -Wcast-align warning > > which doesn't look right: > > > > %%% > > $ cat a.c > > struct foo { > > char x; > > }; > > > > struct foo * > > bubu(char *s) > > { > > > > return (struct foo *)s; > > } > > $ cc -c -Wcast-align a.c > > a.c: In function `bubu': > > a.c:9: warning: cast increases required alignment of target type > > %%% > > > > (None of other supported architecutes see the issue here.) > > You can't cast any random (char *) pointer to a pointer of a type which > is (potentially) larger than 1 byte. It's the same sort of warning you > will get if you try to: > > char ch[] = "\x00\x00\x00\x00"; > char *p = &(ch[0]); > unsigned long *lptr = (unsigned long *)p; > > You cannot guarantee that `ch' is stored in an address that is properly > aligned for (unsigned long), and this is what GCC warns about here. > No, your example I perfectly understand but it is completely different. Note that the first (and only) member in my structure is "char", so it doesn't need to be more than sizeof(char) aligned. > On 2006-11-12 15:27, Stefan Farfeleder <stefan_at_fafoe.narf.at> wrote: > > What is sizeof(struct foo)? If it's > 1 it makes sense. > > Exactly :) > Still doesn't make much sense to me. If all structure members are chars (like is the case with "struct ar_hdr" from <ar.h> which GCC complains about, and in my example, the required alignment shouldn't be more than sizeof(char). What am I missing? Cheers, -- Ruslan Ermilov ru_at_FreeBSD.org FreeBSD committer
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:02 UTC