[ipxe-devel] [PATCH 2/2] [build] Workaround compilation error with gcc 9.1
Philippe Mathieu-Daudé
philmd at redhat.com
Fri Jun 7 09:07:48 UTC 2019
Hi Valentine,
On 5/30/19 7:38 PM, Valentine Barshak wrote:
> Compiling with gcc 9.1 generates lots of "taking address of packed
> member of ... may result in an unaligned pointer value" warnings.
>
> For example:
>
> include/ipxe/uri.h: In function ‘uri_get’:
> include/ipxe/uri.h:178:12: error: taking address of packed member of ‘struct uri’
> may result in an unaligned pointer value [-Werror=address-of-packed-member]
> 178 | ref_get ( &uri->refcnt );
> | ^~~~~~~~~~~~
> include/ipxe/refcnt.h:95:18: note: in definition of macro ‘ref_get’
> 95 | ref_increment ( refcnt ); \
> | ^~~~~~
> include/ipxe/uri.h: In function ‘uri_put’:
> include/ipxe/uri.h:189:12: error: taking address of packed member of ‘struct uri’
> may result in an unaligned pointer value [-Werror=address-of-packed-member]
> 189 | ref_put ( &uri->refcnt );
> | ^~~~~~~~~~~~
> include/ipxe/refcnt.h:109:18: note: in definition of macro ‘ref_put’
> 109 | ref_decrement ( refcnt ); \
> | ^~~~~~
>
> This disables the warning to workaround the compilation issue.
We should ask yourself why do we get this warning, before ignoring it.
If 'struct uri *' is not aligned, the ref_put/get functions will indeed
access unaligned pointer, and might trigger exceptions on some archs.
Following parse_uri() -> zalloc() -> malloc() -> realloc()
/**
* Reallocate memory
*
* @v old_ptr Memory previously allocated by malloc(), or NULL
* @v new_size Requested size
* @ret new_ptr Allocated memory, or NULL
*
* Allocates memory with no particular alignment requirement. @c
* new_ptr will be aligned to at least a multiple of sizeof(void*).
...
Is that enough to confirm 'struct uri *' is always aligned?
If so, this should be clearly documented in the commit message and in
the Makefile around WORKAROUND_CFLAGS += -Wno-address-of-packed-member.
Regards,
Phil.
> Signed-off-by: Valentine Barshak <gvaxon at gmail.com>
> ---
> src/Makefile.housekeeping | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping
> index f8334921..ad9644c2 100644
> --- a/src/Makefile.housekeeping
> +++ b/src/Makefile.housekeeping
> @@ -185,6 +185,13 @@ WNST_TEST = $(CC) -Wstringop-truncation -x c -c /dev/null -o /dev/null \
> >/dev/null 2>&1
> WNST_FLAGS := $(shell $(WNST_TEST) && $(ECHO) '-Wno-stringop-truncation')
> WORKAROUND_CFLAGS += $(WNST_FLAGS)
> +
> +# gcc 9.1 generates warnings for taking address of packed member which
> +# may result in an unaligned pointer value. Inhibit the warnings.
> +WNST_TEST = $(CC) -Wno-address-of-packed-member -x c -c /dev/null -o /dev/null \
> + >/dev/null 2>&1
> +WNST_FLAGS := $(shell $(WNST_TEST) && $(ECHO) '-Wno-address-of-packed-member')
> +WORKAROUND_CFLAGS += $(WNST_FLAGS)
> endif
>
> # Some versions of gas choke on division operators, treating them as
>
More information about the ipxe-devel
mailing list