diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2021-08-03 11:31:13 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2021-08-04 15:26:22 -0400 |
commit | f6c4a82abddd59a33ca38813a5721fac99b08f34 (patch) | |
tree | 82a69aaac3048ae67afd458e760e5302b226f590 /gdb/frame.c | |
parent | d40947728b7f5d42acf5711a0a5f2edec0c1a82a (diff) | |
download | gdb-f6c4a82abddd59a33ca38813a5721fac99b08f34.zip gdb-f6c4a82abddd59a33ca38813a5721fac99b08f34.tar.gz gdb-f6c4a82abddd59a33ca38813a5721fac99b08f34.tar.bz2 |
gdb: avoid dereferencing empty str_offsets_base optional in dwarf_decode_macros
Since 4d7188abfdf2 ("gdbsupport: add debug assertions in
gdb::optional::get"), some macro-related tests fail on Ubuntu 20.04 with
the system gcc 9.3.0 compiler when building with _GLIBCXX_DEBUG. For
example, gdb.base/info-macros.exp results in:
(gdb) break -qualified main
/home/smarchi/src/binutils-gdb/gdb/../gdbsupport/gdb_optional.h:206: internal-error: T& gdb::optional<T>::get() [with T = long unsigned int]: Assertion `this->has_value ()' failed.
The binary contains DWARF 4 debug info and includes a pre-standard
(pre-DWARF 5) .debug_macro section. The CU doesn't have a
DW_AT_str_offsets_base attribute (which doesn't exist in DWARF 4). The
field dwarf2_cu::str_offsets_base is therefore empty. At
dwarf2/read.c:24138, we unconditionally read the value in the optional,
which triggers the assertion shown above.
The same thing happens when building the test program with DWARF 5 with
the same gcc compiler, as that version of gcc doesn't use indirect
string forms, even with DWARF 5. So it still doesn't add a
DW_AT_str_offsets_base attribute on the CU.
Fix that by propagating down a gdb::optional<ULONGEST> for the str
offsets base instead of ULONGEST. That value is only used in
dwarf_decode_macro_bytes, when encountering an "strx" macro operation
(DW_MACRO_define_strx or DW_MACRO_undef_strx). Add a check there that
we indeed have a value in the optional before reading it. This is
unlikely to happen, but could happen in theory with an erroneous file
that uses DW_MACRO_define_strx but does not provide a
DW_AT_str_offsets_base (in practice, some things would probably have
failed before and stopped processing of debug info). I tested the
complaint by inverting the condition and using a clang-compiled binary,
which uses the strx operators. This is the result:
During symbol reading: use of DW_MACRO_define_strx with unknown string offsets base [in module /home/simark/build/binutils-gdb/gdb/testsuite/outputs/gdb.base/info-macros/info-macros]
The test now passes cleanly with the setup mentioned above, and the
testsuite looks on par with how it was before 4d7188abfdf2.
Change-Id: I7ebd2724beb7b9b4178872374c2a177aea696e77
Diffstat (limited to 'gdb/frame.c')
0 files changed, 0 insertions, 0 deletions