[binutils-gdb] bfd: Fix GCC warning when CFLAGS="-Og" is used

Jan Beulich jbeulich@sourceware.org
Fri Sep 6 06:37:07 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=237df762d73a7fdf910277b0644df58688d2d87a

commit 237df762d73a7fdf910277b0644df58688d2d87a
Author: Shahab Vahedi <shahab.vahedi@amd.com>
Date:   Wed Sep 4 12:15:14 2024 +0200

    bfd: Fix GCC warning when CFLAGS="-Og" is used
    
    This patch initializes the "op" variable in skip_cfa_op() function
    of bfd/elf-eh-frame.c to "0" at its declaration point to avoid the
    "maybe-uninitialized" warning.
    
    Building binutils on a system with GCC version 13.2.0 and a configure
    command that sets the optimization level to "-Og" leads to a build
    failure because of a warning being treated as an error:
    ---------------------------------------------------------------------
    $ ./configure CFLAGS="-Og"
    $ make
      ...
      CC       elf-eh-frame.lo
      /src/gdb/bfd/elf-eh-frame.c: In function 'skip_cfa_op':
      /src/gdb/bfd/elf-eh-frame.c:354:33: error: 'op' may be used
        uninitialized [-Werror=maybe-uninitialized]
      354 |   switch (op & 0xc0 ? op & 0xc0 : op)
          |           ~~~~~~~~~~~~~~~~~~~~~~^~~~
      /src/gdb/bfd/elf-eh-frame.c:348:12: note: 'op' was declared here
      348 |   bfd_byte op;
          |            ^~
      cc1: all warnings being treated as errors
      ...
    ---------------------------------------------------------------------
    
    The relevant code snippet related to this warning looks like:
    ---------------------------------------------------------------------
      static inline bool
      read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result)
      {
        if (*iter >= end)
          return false;
        *result = *((*iter)++);
        return true;
      }
    
      static bool
      skip_cfa_op (bfd_byte **iter, bfd_byte *end,...)
      {
        bfd_byte op;
    
        if (!read_byte (iter, end, &op))
          return false;
    
        switch (op & 0xc0 ? op & 0xc0 : op)
        ...
      }
    ---------------------------------------------------------------------
    
    This warning probably happens because "-Og" results in GCC not
    inlining the "read_byte()" function. Therefore, GCC treats its
    invocation inside "skip_cfa_op()" like a black box and that ends
    in the aforementioned warning.
    
    Acknowledgement:
      Lancelot Six -- for coming with the idea behind this fix.
      Jan Beulich  -- for reviewing.
    
    bfd/ChangeLog:
            * elf-eh-frame.c (skip_cfa_op): Initialize the "op" variable.

Diff:
---
 bfd/elf-eh-frame.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 902d7c16334..ebe162f2e5f 100644
--- 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))


More information about the Binutils-cvs mailing list