warning: cast increases required alignment of target type

Warner Losh imp at bsdimp.com
Tue Aug 28 13:12:20 UTC 2012


On Aug 28, 2012, at 2:57 AM, Andrey Zonov wrote:

> 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?

No.  You need to tell the compiler that e has the alignment you think it 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.

Warner

> Index: usr.bin/elf2aout/elf2aout.c
> ===================================================================
> --- usr.bin/elf2aout/elf2aout.c	(revision 239611)
> +++ usr.bin/elf2aout/elf2aout.c	(working copy)
> @@ -126,7 +126,7 @@
> 	entry = xe64toh(e->e_entry);
> 	phoff = xe64toh(e->e_phoff);
> 	phnum = xe16toh(e->e_phnum);
> -	p = (Elf64_Phdr *)((char *)e + phoff);
> +	p = (Elf64_Phdr *)(void *)((char *)e + phoff);
> 	bzero(&a, sizeof(a));
> 	for (i = 0; i < phnum; i++) {
> 		type = xe32toh(p[i].p_type);
> 
> 
> -- 
> Andrey Zonov
> 



More information about the freebsd-arch mailing list