Fix Ada crash with .debug_names
PR ada/25837 points out a crash in the gdb testsuite when .debug_names
is used. You can reproduce like:
runtest --target_board=cc-with-debug-names \
gdb.ada/big_packed_array.exp
The bug was introduced by commit e0802d599
("Avoid copying in
lookup_name_info"). The problem is that the return type of
language_lookup_name changed, but in a way that didn't cause existing
callers to trigger a compilation error. Previously, it returned a
"const string &", but after it returned a "const char *". This caused
a string to be created in dw2_expand_symtabs_matching_symbol, but one
that had too short of a lifetime; so eventually the matcher cache
would wind up with invalid data.
This patch fixes the problem by updating the callers to use the new
type.
Tested on x86-64 Fedora 30.
gdb/ChangeLog
2020-04-23 Tom Tromey <tromey@adacore.com>
PR ada/25837:
* dwarf2/read.c (dw2_expand_symtabs_matching_symbol): Store a
"const char *", not a "const std::string &".
<name_and_matcher::operator==>: Update.
* unittests/lookup_name_info-selftests.c: Change type of
"result".
This commit is contained in:
parent
740480b88a
commit
ecc6c6066b
@ -1,3 +1,12 @@
|
||||
2020-04-23 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
PR ada/25837:
|
||||
* dwarf2/read.c (dw2_expand_symtabs_matching_symbol): Store a
|
||||
"const char *", not a "const std::string &".
|
||||
<name_and_matcher::operator==>: Update.
|
||||
* unittests/lookup_name_info-selftests.c: Change type of
|
||||
"result".
|
||||
|
||||
2020-04-23 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* inferior.h (iterate_over_inferiors): Don't declare.
|
||||
|
@ -3911,11 +3911,11 @@ dw2_expand_symtabs_matching_symbol
|
||||
struct name_and_matcher
|
||||
{
|
||||
symbol_name_matcher_ftype *matcher;
|
||||
const std::string &name;
|
||||
const char *name;
|
||||
|
||||
bool operator== (const name_and_matcher &other) const
|
||||
{
|
||||
return matcher == other.matcher && name == other.name;
|
||||
return matcher == other.matcher && strcmp (name, other.name) == 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -37,14 +37,14 @@ check_make_paramless (const char *file, int line,
|
||||
{
|
||||
lookup_name_info lookup_name (name, symbol_name_match_type::FULL,
|
||||
completion_mode, true /* ignore_parameters */);
|
||||
const std::string &result = lookup_name.language_lookup_name (lang);
|
||||
const char *result = lookup_name.language_lookup_name (lang);
|
||||
|
||||
if (result != expected)
|
||||
if (strcmp (result, expected) != 0)
|
||||
{
|
||||
error (_("%s:%d: make-paramless self-test failed: (completion=%d, lang=%d) "
|
||||
"\"%s\" -> \"%s\", expected \"%s\""),
|
||||
file, line, completion_mode, lang, name,
|
||||
result.c_str (), expected);
|
||||
result, expected);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user