From: Tom de Vries Date: Tue, 28 Apr 2026 13:57:26 +0000 (+0200) Subject: [gdb/breakpoints] Don't ignore in rbreak : X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f037ec99fa1e1e3b3dab77ce4ec7b4924e8ed1fc;p=thirdparty%2Fbinutils-gdb.git [gdb/breakpoints] Don't ignore in rbreak : PR breakpoints/34112 reports that "rbreak :" sets breakpoints in files other than . This is a regression since commit c4c093a31f6 ("Make global_symbol_searcher::filenames private"), which did: ... if (file_name != nullptr) - spec.filenames.push_back (file_name); + spec.add_filename (std::move (file_name)); ... The std::move nullifies file_name, so a subsequent file_name check: ... if (file_name != nullptr) ... now always evaluates to false. Fix this by: - introducing a variable bool file_name_p, initialized before the std::move, and - using that instead. Tested on x86_64-linux. Approved-By: Tom Tromey Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34112 --- diff --git a/gdb/symtab.c b/gdb/symtab.c index 357b8e63b19..3c10e1fd750 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -5440,8 +5440,13 @@ rbreak_command (const char *regexp, int from_tty) } } + /* Compute this property now. We want to use the property after + std::move (file_name), but at that point we can no longer compute it + because the std::move nullifies file_name. */ + bool file_name_p = file_name != nullptr; + global_symbol_searcher spec (SEARCH_FUNCTION_DOMAIN, regexp); - if (file_name != nullptr) + if (file_name_p) spec.add_filename (std::move (file_name)); std::vector symbols = spec.search (); @@ -5454,7 +5459,7 @@ rbreak_command (const char *regexp, int from_tty) std::string name; if (p.msymbol.minsym == nullptr) { - if (file_name != nullptr) + if (file_name_p) { struct symtab *symtab = p.symbol->symtab (); const char *fullname = symtab_to_fullname (symtab); diff --git a/gdb/testsuite/gdb.base/rbreak-2.c b/gdb/testsuite/gdb.base/rbreak-2.c new file mode 100644 index 00000000000..f0d30df2f3c --- /dev/null +++ b/gdb/testsuite/gdb.base/rbreak-2.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2026 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 . */ + +static int +foo (void) +{ + return 0; +} + +int +bar (void) +{ + return foo (); +} diff --git a/gdb/testsuite/gdb.base/rbreak.c b/gdb/testsuite/gdb.base/rbreak.c new file mode 100644 index 00000000000..9df951f3397 --- /dev/null +++ b/gdb/testsuite/gdb.base/rbreak.c @@ -0,0 +1,30 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2026 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 . */ + +static int +foo (void) +{ + return 1; +} + +extern int bar (void); + +int +main (void) +{ + return foo () + bar (); +} diff --git a/gdb/testsuite/gdb.base/rbreak.exp b/gdb/testsuite/gdb.base/rbreak.exp new file mode 100644 index 00000000000..16c7e83cd49 --- /dev/null +++ b/gdb/testsuite/gdb.base/rbreak.exp @@ -0,0 +1,33 @@ +# Copyright 2026 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 . + +# Check rbreak : command. + +standard_testfile .c -2.c + +if { [prepare_for_testing "failed to prepare" $testfile \ + [list $srcfile $srcfile2]] } { + return -1 +} + +# Regression test for PR34112. Check that "rbreak $srcfile:foo" doesn't set +# a breakpoint on $srcfile2:foo. +set re_line \ + [quotemeta \ + "Breakpoint @DECIMAL at @HEX: file @...$srcfile, line @DECIMAL."] +gdb_test "rbreak $srcfile:foo" \ + [multi_line \ + $re_line \ + ".*"]