Date: Tue, 28 Aug 2012 17:06:46 +0300 From: Konstantin Belousov <kostikbel@gmail.com> To: Andrey Zonov <zont@freebsd.org> Cc: freebsd-arch@freebsd.org Subject: Re: warning: cast increases required alignment of target type Message-ID: <20120828140646.GP33100@deviant.kiev.zoral.com.ua> In-Reply-To: <503CCF6E.7080208@FreeBSD.org> References: <503C8809.3050507@FreeBSD.org> <CDF0AE44-1CB2-42F7-BE60-DD2E4697A374@bsdimp.com> <503CCF6E.7080208@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--V5RPc/ioYsxrZT/b Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Aug 28, 2012 at 06:02:22PM +0400, Andrey Zonov wrote: > On 8/28/12 5:12 PM, Warner Losh wrote: > >=20 > > On Aug 28, 2012, at 2:57 AM, Andrey Zonov wrote: > >=20 > >> Hi, > >> > >> Does anyone know how to correctly fix this warning for > >> arm/ia64/mips/sparc64? > >> > >> usr.bin/elf2aout/elf2aout.c: In function 'main': > >> usr.bin/elf2aout/elf2aout.c:129: warning: cast increases required > >> alignment of target type > >> > >> I found this explanation from bde, but still don't understand how to > >> correctly fix this issue. > >> > >> ----------------------------------------------------------------------= -- > >> r99799 | bde | 2002-07-11 22:06:09 +0400 (Thu, 11 Jul 2002) | 10 lines > >> > >> Set NO_WERROR to ignore the following warning which is emitted on > >> alphas: > >> .../elf2aout.c:130: warning: cast increases required alignment of > >> target type > >> The warning is about casting ((char *)e + phoff) to a struct pointer, > >> where e is aligned but phoff might be garbage, so I think the warning > >> should be emitted on most machines (even on i386's, alignment checking > >> might be on) and the correct fix would involve validation phoff before > >> using it. > >> > >> Is this fix correct? > >=20 > > No. You need to tell the compiler that e has the alignment you think i= t has so that it can check to make sure that you are actually right. Just = casting like this defeats the purpose of the check and will break on other = architectures. > >=20 > > Warner > >=20 >=20 > What do you say about this one? >=20 > Index: usr.bin/elf2aout/elf2aout.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- usr.bin/elf2aout/elf2aout.c (revision 239611) > +++ usr.bin/elf2aout/elf2aout.c (working copy) > @@ -126,7 +126,7 @@ > entry =3D xe64toh(e->e_entry); > phoff =3D xe64toh(e->e_phoff); > phnum =3D xe16toh(e->e_phnum); > - p =3D (Elf64_Phdr *)((char *)e + phoff); > + p =3D (Elf64_Phdr *)(e + phoff); This is plain wrong. Pointer arithmetic steps over the object's count, not the char count. You end up incrementing the pointer by sizeof(Elf64_Ehdr) * phoff. --V5RPc/ioYsxrZT/b Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (FreeBSD) iEYEARECAAYFAlA80HUACgkQC3+MBN1Mb4gN/wCeIqW6V9e4laTixzkB+x3mEJGJ prwAn2l9tWplARTgmDer/lRXQ98UyQLU =+2F4 -----END PGP SIGNATURE----- --V5RPc/ioYsxrZT/b--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120828140646.GP33100>