From aa14df25257d62e6c90490c29e524a1cc0c5d503 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Wed, 3 Oct 2012 17:05:00 +0000 Subject: [PATCH] PR symtab/14601 * buildsym.c (buildsym_init): Reset using_directives to NULL. testsuite/ * gdb.cp/using-crash.exp: New file. * gdb.cp/using-crash.cc: New file. --- gdb/ChangeLog | 5 ++++ gdb/buildsym.c | 1 + gdb/testsuite/ChangeLog | 6 ++++ gdb/testsuite/gdb.cp/using-crash.cc | 43 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.cp/using-crash.exp | 32 +++++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 gdb/testsuite/gdb.cp/using-crash.cc create mode 100644 gdb/testsuite/gdb.cp/using-crash.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index abb5449b3e..53f2078220 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2012-10-03 Doug Evans + + PR symtab/14601 + * buildsym.c (buildsym_init): Reset using_directives to NULL. + 2012-10-02 Andrew Burgess * remote-sim.c (dump_mem): Always dump buffer contents, zero fill diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 1ce40b9d86..8f2e7327af 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -1488,6 +1488,7 @@ buildsym_init (void) global_symbols = NULL; pending_blocks = NULL; pending_macros = NULL; + using_directives = NULL; /* We shouldn't have any address map at this point. */ gdb_assert (! pending_addrmap); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5c280ed0d0..f0f8203625 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-10-03 Doug Evans + + PR symtab/14601 + * gdb.cp/using-crash.exp: New file. + * gdb.cp/using-crash.cc: New file. + 2012-10-02 Doug Evans * lib/gdb.exp (gdb_unload): Change wording of perror text to be diff --git a/gdb/testsuite/gdb.cp/using-crash.cc b/gdb/testsuite/gdb.cp/using-crash.cc new file mode 100644 index 0000000000..a3a5e43ef2 --- /dev/null +++ b/gdb/testsuite/gdb.cp/using-crash.cc @@ -0,0 +1,43 @@ +/* Copyright 2012 Free Software Foundation, Inc. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +using namespace std; + +class c1; + +void foo (); + +int +main () +{ + foo (); + return 0; +} + +void +foo () +{ + c1 *p = 0; +} + +class b1 { public: int x; }; + +class c1 : public b1 +{ + public: + using b1::x; + c1 () {} +}; diff --git a/gdb/testsuite/gdb.cp/using-crash.exp b/gdb/testsuite/gdb.cp/using-crash.exp new file mode 100644 index 0000000000..0aa2198258 --- /dev/null +++ b/gdb/testsuite/gdb.cp/using-crash.exp @@ -0,0 +1,32 @@ +# Copyright 2012 Free Software Foundation, Inc. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +standard_testfile .cc + +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { + return -1 +} + +runto "foo" + +# This would cause reading debug info with using_directives pointing to +# freed memory. +# http://sourceware.org/bugzilla/show_bug.cgi?id=14601 +# Note: You may need to compile with -fdebug-types-section to see the crash. +set test "reload file" +if { [gdb_file_cmd "$binfile"] == 0 } { + pass $test +} else { + fail $test +}