]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libdwfl: Initialize bits to NULL in dwfl_standard_find_debuginfo for LTO.
authorMark Wielaard <mark@klomp.org>
Thu, 16 Apr 2020 15:45:31 +0000 (17:45 +0200)
committerMark Wielaard <mark@klomp.org>
Thu, 16 Apr 2020 15:45:31 +0000 (17:45 +0200)
GCC10 LTO is too smart (and somewhat cryptic):

    find-debuginfo.c: In function ‘dwfl_standard_find_debuginfo’:
    debuginfod-client.c:85:8: error: ‘bits’ may be used uninitialized
    in this function [-Werror=maybe-uninitialized]
    find-debuginfo.c:360:24: note: ‘bits’ was declared here
    lto1: all warnings being treated as errors

So it inlines __libdwfl_debuginfod_find_debuginfo into
dwfl_standard_find_debuginfo and since it cannot see into the
function pointer (*fp_debuginfod_find_debuginfo), it assumes that
build_id_bit (== bits in dwfl_standard_find_debuginfo) will be used
by the called function and it might not be initialized.
But if you read the code the there is a check for build_id_len > 0
to see whether bits is or isn't initialized before using bits.
But gcc isn't smart enough to figure that out.

Maybe that actually should be an heuristic gcc lto should use.
If the callchain I am inlining is so deep that I cannot figure out
maybe-uninitialized variables anymore I should stop inlining.

For now just help GCC out and initialize bits to NULL.

Signed-off-by: Mark Wielaard <mark@klomp.org>
libdwfl/ChangeLog
libdwfl/find-debuginfo.c

index 0b95490aadf4da2162a37125627c2dc95ab8828c..4ddc9ad472a2248a3e9f298cfcec02ac1ee1182b 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-16  Mark Wielaard  <mark@klomp.org>
+
+       * find-debuginfo.c (dwfl_standard_find_debuginfo): Initialize bits
+       to NULL.
+
 2020-01-24  Mark Wielaard  <mark@klomp.org>
 
        * linux-kernel-modules.c (find_kernel_elf): Check release isn't NULL.
index 4085764547fbe2a06d3e1aeffd83bea834f3d36f..2dd11c48df46d42b02b9870aaa34d6877a91ffa3 100644 (file)
@@ -357,7 +357,7 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod,
 {
   /* First try by build ID if we have one.  If that succeeds or fails
      other than just by finding nothing, that's all we do.  */
-  const unsigned char *bits;
+  const unsigned char *bits = NULL;
   GElf_Addr vaddr;
   int bits_len;
   if ((bits_len = INTUSE(dwfl_module_build_id) (mod, &bits, &vaddr)) > 0)