Skip site navigation (1)Skip section navigation (2)
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>