diff options
author | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2019-11-29 12:17:36 +0100 |
---|---|---|
committer | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2019-11-29 12:18:21 +0100 |
commit | e9194a1a0e49f0646d5ac415836cc5d133f14bbe (patch) | |
tree | c4a6ebe2cea13ab40b0c0c15f21de41d7a61cb72 /gdb/valops.c | |
parent | 13364701d8c1b5b184ac6db4b835a3bb680766a0 (diff) | |
download | gdb-e9194a1a0e49f0646d5ac415836cc5d133f14bbe.zip gdb-e9194a1a0e49f0646d5ac415836cc5d133f14bbe.tar.gz gdb-e9194a1a0e49f0646d5ac415836cc5d133f14bbe.tar.bz2 |
gdb: fix segfault in overload resolution debug output
A segfault occurs if overload resolution debug mode is turned on via
the 'set debug overload' command. E.g.:
~~~
$ gdb ./a.out
...
(gdb) start
...
(gdb) set debug overload 1
(gdb) print foo(5)
-- Arg is int [8], parm is double [9]
Overloaded function instance (null) # of parms 1
Segmentation fault
$
~~~
The problem is, GDB tries to print the badness vector after it has
been std::move'd. Fix the problem by printing the vector before it is
moved.
gdb/ChangeLog:
2019-11-29 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* valops.c (find_oload_champ): Print part of debug messages
before the badness vector is std::move'd.
Change-Id: Ia623f9637e82ec332bfeac23eb6b0f2ffdcdde27
Diffstat (limited to 'gdb/valops.c')
-rw-r--r-- | gdb/valops.c | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/gdb/valops.c b/gdb/valops.c index cbb1f30..8af53de 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -3023,6 +3023,28 @@ find_oload_champ (gdb::array_view<value *> args, bv = rank_function (parm_types, args.slice (static_offset)); + if (overload_debug) + { + if (methods != NULL) + fprintf_filtered (gdb_stderr, + "Overloaded method instance %s, # of parms %d\n", + methods[ix].physname, (int) parm_types.size ()); + else if (xmethods != NULL) + fprintf_filtered (gdb_stderr, + "Xmethod worker, # of parms %d\n", + (int) parm_types.size ()); + else + fprintf_filtered (gdb_stderr, + "Overloaded function instance " + "%s # of parms %d\n", + functions[ix]->demangled_name (), + (int) parm_types.size ()); + for (jj = 0; jj < args.size () - static_offset; jj++) + fprintf_filtered (gdb_stderr, + "...Badness @ %d : %d\n", + jj, bv[jj].rank); + } + if (oload_champ_bv->empty ()) { *oload_champ_bv = std::move (bv); @@ -3048,29 +3070,9 @@ find_oload_champ (gdb::array_view<value *> args, break; } if (overload_debug) - { - if (methods != NULL) - fprintf_filtered (gdb_stderr, - "Overloaded method instance %s, # of parms %d\n", - methods[ix].physname, (int) parm_types.size ()); - else if (xmethods != NULL) - fprintf_filtered (gdb_stderr, - "Xmethod worker, # of parms %d\n", - (int) parm_types.size ()); - else - fprintf_filtered (gdb_stderr, - "Overloaded function instance " - "%s # of parms %d\n", - functions[ix]->demangled_name (), - (int) parm_types.size ()); - for (jj = 0; jj < args.size () - static_offset; jj++) - fprintf_filtered (gdb_stderr, - "...Badness @ %d : %d\n", - jj, bv[jj].rank); - fprintf_filtered (gdb_stderr, "Overload resolution " - "champion is %d, ambiguous? %d\n", - oload_champ, oload_ambiguous); - } + fprintf_filtered (gdb_stderr, "Overload resolution " + "champion is %d, ambiguous? %d\n", + oload_champ, oload_ambiguous); } return oload_champ; |