[PATCH] bfd: Fix -Wmaybe-uninitialized in elf-eh-frame.c

Jan Beulich jbeulich@suse.com
Mon Mar 18 07:17:16 GMT 2024


On 15.03.2024 16:57, Aaron Merey wrote:
> Fix the following build error:
> 
> elf-eh-frame.c: In function ‘skip_cfa_op’:
> elf-eh-frame.c:354:33: error: ‘op’ may be used uninitialized [-Werror=maybe-uninitialized]
>   354 |   switch (op & 0xc0 ? op & 0xc0 : op)
>       |           ~~~~~~~~~~~~~~~~~~~~~~^~~~
> elf-eh-frame.c:348:12: note: ‘op’ was declared here
>   348 |   bfd_byte op;
>       |            ^~
> 
> Build error seen with GCC 13.2.1 20231011 (Red Hat 13.2.1-4)
> 
> 	* elf-eh-frame.c (skip_cfa_op): Define variable op with value 0.

While I can see that a workaround is needed if indeed even a recent
compiler doesn't get things right here, this pretty clearly being a
bogus diagnostic in this case - have you also filed a bug report
against the compiler? Would be nice to cross-reference that here.

Furthermore, with no-one else having noticed this so far I wonder
whether there aren't further criteria here for the issue to surface,
like special compiler options passed in your particular build. Those
would imo also be relevant to mention.

> --- a/bfd/elf-eh-frame.c
> +++ b/bfd/elf-eh-frame.c
> @@ -345,7 +345,7 @@ next_cie_fde_offset (const struct eh_cie_fde *ent,
>  static bool
>  skip_cfa_op (bfd_byte **iter, bfd_byte *end, unsigned int encoded_ptr_width)
>  {
> -  bfd_byte op;
> +  bfd_byte op = 0;
>    bfd_vma length;
>  
>    if (!read_byte (iter, end, &op))

As to "pretty clearly bogus": If the compiler decides to not inline
read_byte(), it shouldn't make assumptions on op's state. Whereas if
the function is inlined, its return value is clearly tied the state
of the variable.

I further wonder whether, if there already is one such case, it
wouldn't be better to work around the issue in read_byte() itself ...
I can't really see why e.g. the use in skip_leb128() shouldn't get
the exact same warning for "byte".

Jan


More information about the Binutils mailing list