summaryrefslogtreecommitdiff
path: root/libdwfl
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2020-04-16 17:45:31 +0200
committerMark Wielaard <mark@klomp.org>2020-04-16 17:45:31 +0200
commit39f28eaf8c821d71d57ffc759655ec4168d0bead (patch)
tree6f13f166ef81d13860d4323e777a1d5300734b85 /libdwfl
parent1a9fe4bfa71b6ad87555ef8e5b204e2ad3285213 (diff)
downloadelfutils-39f28eaf8c821d71d57ffc759655ec4168d0bead.tar.gz
libdwfl: Initialize bits to NULL in dwfl_standard_find_debuginfo for LTO.
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>
Diffstat (limited to 'libdwfl')
-rw-r--r--libdwfl/ChangeLog5
-rw-r--r--libdwfl/find-debuginfo.c2
2 files changed, 6 insertions, 1 deletions
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 0b95490a..4ddc9ad4 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -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.
diff --git a/libdwfl/find-debuginfo.c b/libdwfl/find-debuginfo.c
index 40857645..2dd11c48 100644
--- a/libdwfl/find-debuginfo.c
+++ b/libdwfl/find-debuginfo.c
@@ -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)