aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2015-02-27 09:55:07 -0800
committerKeith Seitz <keiths@redhat.com>2015-03-23 12:50:28 -0700
commit7e993ebf2343a5b39d6d1df29fdebc2818064ae5 (patch)
treefeff02f0e16e1f84bc4c35ab48298f81f4d2bdb3 /gdb/testsuite/gdb.dwarf2/staticvirtual.exp
parent[OBV] Fix build -- missing ';' (diff)
downloadbinutils-gdb-7e993ebf2343a5b39d6d1df29fdebc2818064ae5.tar.gz
binutils-gdb-7e993ebf2343a5b39d6d1df29fdebc2818064ae5.tar.bz2
binutils-gdb-7e993ebf2343a5b39d6d1df29fdebc2818064ae5.zip
PR gdb/18021 - defend against "static virtual" methods
This bug appears to be caused by bad debuginfo. The method causing the sefault in the reporter's test case is marked both static and virtual. This patch simply safegaurds against this case in dwarf2_add_member_fn, where the code assumes that there is a `this' pointer when a virtual method is seen (more specifically, when DW_AT_vtable_elem is seen). It previously dereferenced the first formal parameter (`this' pointer), which in this case doesn't exist. GDB consequently segfaulted dereferencing a NULL pointer. gdb/ChangeLog PR gdb/18021 * dwarf2read.c (dwarf2_add_member_fn): Issue a complaint if we find a static method with DW_AT_vtable_elem_location. gdb/testsuite/ChangeLog PR gdb/18021 * gdb.dwarf2/staticvirtual.exp: New test.
Diffstat (limited to 'gdb/testsuite/gdb.dwarf2/staticvirtual.exp')
-rw-r--r--gdb/testsuite/gdb.dwarf2/staticvirtual.exp54
1 files changed, 54 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.dwarf2/staticvirtual.exp b/gdb/testsuite/gdb.dwarf2/staticvirtual.exp
new file mode 100644
index 00000000000..06d46e15b1b
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/staticvirtual.exp
@@ -0,0 +1,54 @@
+# Copyright 2015 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 <http://www.gnu.org/licenses/>.
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+ return 0
+}
+
+if { [skip_cplus_tests] } { continue }
+
+standard_testfile main.c staticvirtual-dw.S
+
+# Make DWARF for the test.
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+ cu {} {
+ compile_unit {{language @DW_LANG_C_plus_plus}} {
+ structure_type {
+ {name S}
+ {byte_size 1 DW_FORM_sdata}
+ } {
+ subprogram {
+ {low_pc 0x1000 addr}
+ {high_pc 0x2000 addr}
+ {name ~S}
+ {external 1 flag}
+ {virtuality @DW_VIRTUALITY_virtual}
+ {vtable_elem_location {const1u 1} SPECIAL_expr}
+ }
+ }
+ }
+ }
+}
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} \
+ [list $srcfile $asm_file] {nodebug}] } {
+ return -1
+}
+
+# gdb/18021: The test below would cause GDB to crash.
+gdb_test "p S::~S" "0x1000"