gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 11 May 2009 15:05:56 +0000 (15:05 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 11 May 2009 15:05:56 +0000 (15:05 +0000)
Fix internal error on breaking at a multi-locations caller source line.
* breakpoint.c (parse_breakpoint_sals): Set EXPLICIT_PC for the `break'
command with no parameters.

gdb/testsuite/
* gdb.cp/expand-sals.exp, gdb.cp/expand-sals.cc: New.

gdb/ChangeLog
gdb/breakpoint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/expand-sals.cc [new file with mode: 0644]
gdb/testsuite/gdb.cp/expand-sals.exp [new file with mode: 0644]

index 37cb1bfc709c9b0500c29f30256a420104949725..92c47a1597b0d6bbfbc3e81392cb0f8bc55684f0 100644 (file)
@@ -1,3 +1,9 @@
+2009-05-11  Joel Brobecker <brobecker@adacore.com>
+
+       Fix internal error on breaking at a multi-locations caller source line.
+       * breakpoint.c (parse_breakpoint_sals): Set EXPLICIT_PC for the `break'
+       command with no parameters.
+
 2009-05-11  Pedro Alves  <pedro@codesourcery.com>
 
        * linux-nat.c (enum sigchld_state): Delete.
index e832596f10bef83d9c42fc5a44cb5339ecfff266..d403f360b05e9ea84d9652793e733c41796813dc 100644 (file)
@@ -5494,6 +5494,14 @@ parse_breakpoint_sals (char **address,
          sal.line = default_breakpoint_line;
          sal.symtab = default_breakpoint_symtab;
          sal.section = find_pc_overlay (sal.pc);
+
+         /* "break" without arguments is equivalent to "break *PC" where PC is
+            the default_breakpoint_address.  So make sure to set
+            sal.explicit_pc to prevent GDB from trying to expand the list of
+            sals to include all other instances with the same symtab and line.
+          */
+         sal.explicit_pc = 1;
+
          sals->sals[0] = sal;
          sals->nelts = 1;
        }
index 83409c729bff6c5126d03deeb39ba83b8679c02d..c9d0f8fb4784f18dcc20804c2743ca956ce0d594 100644 (file)
@@ -1,3 +1,7 @@
+2009-05-11  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.cp/expand-sals.exp, gdb.cp/expand-sals.cc: New.
+
 2009-04-30  Doug Evans  <dje@google.com>
 
        * gdb.threads/watchthreads2.exp: New testcase.
diff --git a/gdb/testsuite/gdb.cp/expand-sals.cc b/gdb/testsuite/gdb.cp/expand-sals.cc
new file mode 100644 (file)
index 0000000..6169a05
--- /dev/null
@@ -0,0 +1,53 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright (C) 2009 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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/>.  */
+
+int
+func ()
+{
+  return 42;   /* func-line */
+}
+
+volatile int global_x;
+
+class A
+{
+public:
+  A ()
+    {
+      global_x = func ();      /* caller-line */
+    }
+};
+
+/* class B is here just to make the `func' calling line above having multiple
+   instances - multiple locations.  Template cannot be used as its instances
+   would have different function names which get discarded by GDB
+   expand_line_sal_maybe.  */
+
+class B : public A
+{
+};
+
+int
+main (void)
+{
+  A a;
+  B b;
+
+  return 0;    /* exit-line */
+}
diff --git a/gdb/testsuite/gdb.cp/expand-sals.exp b/gdb/testsuite/gdb.cp/expand-sals.exp
new file mode 100644 (file)
index 0000000..3c302c3
--- /dev/null
@@ -0,0 +1,58 @@
+# Copyright 2009 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/>.
+
+if { [skip_cplus_tests] } { continue }
+
+set srcfile expand-sals.cc
+if { [prepare_for_testing expand-sals.exp expand-sals $srcfile {debug c++}] } {
+    return -1
+}
+if ![runto_main] {
+    return -1
+}
+
+gdb_breakpoint [gdb_get_line_number "exit-line"]
+
+gdb_breakpoint [gdb_get_line_number "func-line"]
+gdb_continue_to_breakpoint "func" ".*func-line.*"
+
+gdb_test "up" "caller-line.*"
+
+# PC should not be now at the boundary of source lines to make the original bug
+# exploitable.  The GLOBAL_X variable exists in the source for this purpose.
+
+# Original problem was an internal error here.
+set test "break"
+gdb_test_multiple $test $test {
+    -re "Breakpoint \[0-9\]+ at .*, line \[0-9\]+\\. \\(\[2-9\] locations\\)\r\n$gdb_prompt $" {
+       fail $test
+    }
+    -re "Breakpoint \[0-9\]+ at .*, line \[0-9\]+\\.\r\n$gdb_prompt $" {
+       pass $test
+    }
+}
+
+gdb_continue_to_breakpoint "caller" ".*caller-line.*"
+
+# Test GDB caught this return call and not the next one through B::B()
+gdb_test "bt" \
+        "#0 \[^\r\n\]* A \[^\r\n\]*\r\n#1 \[^\r\n\]* main \[^\r\n\]*" \
+        "bt from A"
+
+gdb_continue_to_breakpoint "next caller func" ".*func-line.*"
+
+# Verify GDB really could not catch any other breakpoint location.
+
+gdb_continue_to_breakpoint "uncaught return" ".*exit-line.*"