From: Shahab Vahedi Date: Wed, 4 Sep 2024 10:15:14 +0000 (+0200) Subject: bfd: Fix GCC warning when CFLAGS="-Og" is used X-Git-Tag: gdb-16-branchpoint~988 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=237df762d73a7fdf910277b0644df58688d2d87a;p=thirdparty%2Fbinutils-gdb.git 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 --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))