From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 36482 invoked by alias); 4 Feb 2016 18:37:22 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 36449 invoked by uid 89); 4 Feb 2016 18:37:21 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=documentary, 405, nonexistent, Operator X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 04 Feb 2016 18:37:17 +0000 Received: from svr-orw-fem-03.mgc.mentorg.com ([147.34.97.39]) by relay1.mentorg.com with esmtp id 1aROmI-0003VV-FY from Don_Breazeal@mentor.com for gdb-patches@sourceware.org; Thu, 04 Feb 2016 10:37:14 -0800 Received: from [172.30.6.178] (147.34.91.1) by SVR-ORW-FEM-03.mgc.mentorg.com (147.34.97.39) with Microsoft SMTP Server (TLS) id 14.3.224.2; Thu, 4 Feb 2016 10:37:14 -0800 Subject: [PING] Re: [PATCH v4] PR 18303, Tolerate malformed input for lookup_symbol-called functions. To: References: <1454021528-7073-1-git-send-email-donb@codesourcery.com> From: Don Breazeal Message-ID: <56B39A52.9010203@codesourcery.com> Date: Thu, 04 Feb 2016 18:37:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <1454021528-7073-1-git-send-email-donb@codesourcery.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2016-02/txt/msg00130.txt.bz2 On 1/28/2016 2:52 PM, Don Breazeal wrote: > Apologies -- the previous version of this patch was missing one file, > added here. Sorry for the noise. > --Don > > ---V3 Comment--- > This patch differs from v2 in that the new test gdb.linespec/ls-errs-cp.exp > is gone, and instead (per Pedro's suggestion) gdb.linespec/ls-errs.exp has > been modified to test both C & C++, and to incorporate the small amount of > extra testing from ls-errs-cp.exp. > > It also includes, unchanged from the previous version of the patch: > > * an updated version of the alternate fix that Keith proposed for my > patch that addressed PR breakpoints/18303. Doug has approved (in > concept, at least) the code portion of the patch. > > * a couple of other new tests of colons in linespecs. > > Thanks, > --Don > > ----------- > lookup_symbol is often called with user input. Consequently, any > function called from lookup_symbol{,_in_language} should attempt to > deal with malformed input gracefully. After all, malformed user > input is not a programming/API error. > > This patch does not attempt to find/correct all instances of this. It > only fixes locations in the code that trigger test suite failures. > > This patch fixes PR breakpoints/18303, "Assertion: -breakpoint-insert > with windows paths of file in non-current directory". > > The patch includes three new tests related to this. One is just > gdb.linespec/ls-errs.exp copied and converted to use C++ instead of C, and > to add a case using a file name containing a Windows-style logical drive > specifier. The others include an MI test to provide a regression test for > the specific case reported in PR 18303, and a C++ test for proper error > handling of access to a program variable when using a file scope specifier > that refers to a non-existent file. > > Tested on x86_64 native Linux. > > gdb/ChangeLog > 2016-01-28 Keith Seitz > > PR breakpoints/18303 > * cp-namespace.c (cp_lookup_bare_symbol): Change assertion to > look for "::" instead of simply ":". > (cp_search_static_and_baseclasses): Return null_block_symbol for > malformed input. > Remove assertions. > * cp-support.c (cp_find_first_component_aux): Do not return > a prefix length for ':' unless the next character is also ':'. > > gdb/testsuite/ChangeLog > 2016-01-28 Don Breazeal > > * gdb.cp/scope-err.cc: New test program. > * gdb.cp/scope-err.exp: New test script. > * gdb.linespec/ls-errs.c (myfunction): Expanded to have multiple > lines and "set breakpoint here" comment. > * gdb.linespec/ls-errs.exp: Added C++ testing and new test case. > * gdb.mi/mi-linespec-err-cp.cc: New test program. > * gdb.mi/mi-linespec-err-cp.exp: New test script. > > --- > gdb/cp-namespace.c | 9 +- > gdb/cp-support.c | 7 +- > gdb/testsuite/gdb.cp/scope-err.cc | 35 +++ > gdb/testsuite/gdb.cp/scope-err.exp | 47 ++++ > gdb/testsuite/gdb.linespec/ls-errs.c | 13 +- > gdb/testsuite/gdb.linespec/ls-errs.exp | 384 +++++++++++++++------------- > gdb/testsuite/gdb.mi/mi-linespec-err-cp.cc | 35 +++ > gdb/testsuite/gdb.mi/mi-linespec-err-cp.exp | 57 +++++ > 8 files changed, 405 insertions(+), 182 deletions(-) > > diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c > index 72002d6..016a42f 100644 > --- a/gdb/cp-namespace.c > +++ b/gdb/cp-namespace.c > @@ -170,7 +170,7 @@ cp_lookup_bare_symbol (const struct language_defn *langdef, > ':' may be in the args of a template spec. This isn't intended to be > a complete test, just cheap and documentary. */ > if (strchr (name, '<') == NULL && strchr (name, '(') == NULL) > - gdb_assert (strchr (name, ':') == NULL); > + gdb_assert (strstr (name, "::") == NULL); > > sym = lookup_symbol_in_static_block (name, block, domain); > if (sym.symbol != NULL) > @@ -246,10 +246,9 @@ cp_search_static_and_baseclasses (const char *name, > struct block_symbol klass_sym; > struct type *klass_type; > > - /* The test here uses <= instead of < because Fortran also uses this, > - and the module.exp testcase will pass "modmany::" for NAME here. */ > - gdb_assert (prefix_len + 2 <= strlen (name)); > - gdb_assert (name[prefix_len + 1] == ':'); > + /* Check for malformed input. */ > + if (prefix_len + 2 > strlen (name) || name[prefix_len + 1] != ':') > + return null_block_symbol; > > /* Find the name of the class and the name of the method, variable, etc. */ > > diff --git a/gdb/cp-support.c b/gdb/cp-support.c > index df127c4..a71c6ad 100644 > --- a/gdb/cp-support.c > +++ b/gdb/cp-support.c > @@ -1037,8 +1037,13 @@ cp_find_first_component_aux (const char *name, int permissive) > return strlen (name); > } > case '\0': > - case ':': > return index; > + case ':': > + /* ':' marks a component iff the next character is also a ':'. > + Otherwise it is probably malformed input. */ > + if (name[index + 1] == ':') > + return index; > + break; > case 'o': > /* Operator names can screw up the recursion. */ > if (operator_possible > diff --git a/gdb/testsuite/gdb.cp/scope-err.cc b/gdb/testsuite/gdb.cp/scope-err.cc > new file mode 100644 > index 0000000..19c92d8 > --- /dev/null > +++ b/gdb/testsuite/gdb.cp/scope-err.cc > @@ -0,0 +1,35 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2016 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 . */ > + > +int > +myfunction (int aa) > +{ > + int i; > + > + i = aa + 42; > + return i; /* set breakpoint here */ > +} > + > +int > +main (void) > +{ > + int a; > + > + a = myfunction (a); > + > + return a; > +} > diff --git a/gdb/testsuite/gdb.cp/scope-err.exp b/gdb/testsuite/gdb.cp/scope-err.exp > new file mode 100644 > index 0000000..9d93578 > --- /dev/null > +++ b/gdb/testsuite/gdb.cp/scope-err.exp > @@ -0,0 +1,47 @@ > +# Copyright 2012-2016 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 . > + > +# Tests for linespec errors with C++. > +# Derived from gdb.linespec/ls-errs.exp. > + > +if { [skip_cplus_tests] } { continue } > + > +standard_testfile .cc > +set exefile $testfile > + > +if {[prepare_for_testing $testfile $exefile $srcfile {debug c++}]} { > + return -1 > +} > + > +if ![runto_main] { > + fail "Can't run to main" > + return 0 > +} > + > +# Run to a location in the file. > +set bp_location [gdb_get_line_number "set breakpoint here"] > + > +gdb_test "break $srcfile:$bp_location" \ > + "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \ > + "breakpoint line number in file" > + > +gdb_continue_to_breakpoint "$bp_location" > + > +# Try to access a variable using scope that is a non-existent filename > +# with a Windows-style logical drive in the name. > +set nonexistent_file C:/does/not/exist.cc > +gdb_test "print '$nonexistent_file'::var" \ > + ".*No symbol \"$nonexistent_file\" in current context.*" \ > + "print var from \"$nonexistent_file\"" > diff --git a/gdb/testsuite/gdb.linespec/ls-errs.c b/gdb/testsuite/gdb.linespec/ls-errs.c > index ca41342..a3a43db 100644 > --- a/gdb/testsuite/gdb.linespec/ls-errs.c > +++ b/gdb/testsuite/gdb.linespec/ls-errs.c > @@ -15,14 +15,21 @@ > You should have received a copy of the GNU General Public License > along with this program. If not, see . */ > > -int myfunction (void) { return 0; } > +int > +myfunction (int aa) > +{ > + int i; > + > + i = aa + 42; > + return i; /* set breakpoint here */ > +} > > int > main (void) > -{ > +{ > int a; > > - a = myfunction (); > + a = myfunction (a); > > here: > return a; > diff --git a/gdb/testsuite/gdb.linespec/ls-errs.exp b/gdb/testsuite/gdb.linespec/ls-errs.exp > index 16d4574..35f8f78 100644 > --- a/gdb/testsuite/gdb.linespec/ls-errs.exp > +++ b/gdb/testsuite/gdb.linespec/ls-errs.exp > @@ -13,209 +13,247 @@ > # You should have received a copy of the GNU General Public License > # along with this program. If not, see . > > -# Tests for linespec error conditions > +# Tests for linespec errors with C and C++. > > -standard_testfile > -set exefile $testfile > +# The test proper. LANG is either C or C++. > > -if {[prepare_for_testing $testfile $exefile $srcfile \ > - {debug nowarnings}]} { > - return -1 > -} > +proc do_test {lang} { > + global testfile srcfile error_messages compiler_info > > -# Turn off the pending breakpoint queries. > -gdb_test_no_output "set breakpoint pending off" > + standard_testfile > + set exefile $testfile > + if [info exists compiler_info] { > + # Unsetting compiler_info allows us to switch compilers > + # used by prepare_for_testing. > + unset compiler_info > + } > + set options {debug} > > -# Turn off completion limiting > -gdb_test_no_output "set max-completions unlimited" > + if { $lang == "C++" } { > + if { [skip_cplus_tests] } { return 0 } > + # Build ".c" source file with g++. > + lappend options "c++" > + } > > -# We intentionally do not use gdb_breakpoint for these tests. > + if {[prepare_for_testing $testfile $exefile $srcfile $options]} { > + return -1 > + } > > -# Break at 'linespec' and expect the message in ::error_messages indexed by > -# msg_id with the associated args. > -proc test_break {linespec msg_id args} { > - global error_messages > + # Turn off the pending breakpoint queries. > + gdb_test_no_output "set breakpoint pending off" > > - gdb_test "break $linespec" [string_to_regexp \ > - [eval format \$error_messages($msg_id) $args]] > -} > + # Turn off completion limiting > + gdb_test_no_output "set max-completions unlimited" > > -# Common error message format strings. > -array set error_messages { > - invalid_file "No source file named %s." > - invalid_function "Function \"%s\" not defined." > - invalid_var_or_func "Undefined convenience variable or function \"%s\" not defined." > - invalid_function_f "Function \"%s\" not defined in \"%s\"." > - invalid_var_or_func_f \ > - "Undefined convenience variable or function \"%s\" not defined in \"%s\"." > - invalid_label "No label \"%s\" defined in function \"%s\"." > - invalid_parm "invalid linespec argument, \"%s\"" > - invalid_offset "No line %d in the current file." > - invalid_offset_f "No line %d in file \"%s\"." > - malformed_line_offset "malformed line offset: \"%s\"" > - source_incomplete \ > - "Source filename requires function, label, or line offset." > - unexpected "malformed linespec error: unexpected %s" > - unexpected_opt "malformed linespec error: unexpected %s, \"%s\"" > - unmatched_quote "unmatched quote" > - garbage "Garbage '%s' at end of command" > -} > + if ![runto_main] { > + fail "Can't run to main" > + return 0 > + } > > -# Some commonly used whitespace tests around ':'. > -set spaces [list ":" ": " " :" " : " "\t: " " :\t" "\t:\t" " \t:\t " \ > - "\t \t:\t \t \t"] > + # Run to a location in the file. > + set bp_location [gdb_get_line_number "set breakpoint here"] > + > + gdb_test "break $srcfile:$bp_location" \ > + "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \ > + "breakpoint line number in file" > + > + gdb_continue_to_breakpoint "$bp_location" > + > + # Common error message format strings. > + array set error_messages { > + invalid_file "No source file named %s." > + invalid_function "Function \"%s\" not defined." > + invalid_var_or_func > + "Undefined convenience variable or function \"%s\" not defined." > + invalid_function_f "Function \"%s\" not defined in \"%s\"." > + invalid_var_or_func_f \ > + "Undefined convenience variable or function \"%s\" not defined in \"%s\"." > + invalid_label "No label \"%s\" defined in function \"%s\"." > + invalid_parm "invalid linespec argument, \"%s\"" > + invalid_offset "No line %d in the current file." > + invalid_offset_f "No line %d in file \"%s\"." > + malformed_line_offset "malformed line offset: \"%s\"" > + source_incomplete \ > + "Source filename requires function, label, or line offset." > + unexpected "malformed linespec error: unexpected %s" > + unexpected_opt "malformed linespec error: unexpected %s, \"%s\"" > + unmatched_quote "unmatched quote" > + garbage "Garbage '%s' at end of command" > + } > > -# A list of invalid offsets. > -set invalid_offsets [list -100 +500 1000] > + # We intentionally do not use gdb_breakpoint for these tests. > > -# Try some simple, invalid linespecs involving spaces. > -foreach x $spaces { > - test_break $x unexpected "colon" > -} > + # Break at 'linespec' and expect the message in ::error_messages > + # indexed by msg_id with the associated args. > + proc test_break {linespec msg_id args} { > + global error_messages > > -# Test invalid filespecs starting with offset. This is done > -# first so that default offsets are tested. > -foreach x $invalid_offsets { > - set offset $x > - > - # Relative offsets are relative to line 16. Adjust > - # expected offset from error message accordingly. > - if {[string index $x 0] == "+" || > - [string index $x 0] == "-"} { > - incr offset 16 > + gdb_test "break $linespec" [string_to_regexp \ > + [eval format \$error_messages($msg_id) \ > + $args]] > } > - test_break $x invalid_offset $offset > - test_break "-line $x" invalid_offset $offset > -} > > -# Test offsets with trailing tokens w/ and w/o spaces. > -foreach x $spaces { > - test_break "3$x" unexpected "colon" > - test_break "+10$x" unexpected "colon" > - test_break "-10$x" unexpected "colon" > -} > + # Some commonly used whitespace tests around ':'. > + set spaces [list ":" ": " " :" " : " "\t: " " :\t" "\t:\t" \ > + " \t:\t " "\t \t:\t \t \t"] > > -foreach x {1 +1 +100 -10} { > - test_break "3 $x" unexpected_opt "number" $x > - test_break "-line 3 $x" garbage $x > - test_break "+10 $x" unexpected_opt "number" $x > - test_break "-line +10 $x" garbage $x > - test_break "-10 $x" unexpected_opt "number" $x > - test_break "-line -10 $x" garbage $x > -} > + # A list of invalid offsets. > + set invalid_offsets [list -100 +500 1000] > > -foreach x {3 +10 -10} { > - test_break "$x foo" unexpected_opt "string" "foo" > - test_break "-line $x foo" garbage "foo" > -} > + # Try some simple, invalid linespecs involving spaces. > + foreach x $spaces { > + test_break $x unexpected "colon" > + } > > -# Test invalid linespecs starting with filename. > -foreach x [list "this_file_doesn't_exist.c" \ > - "this file has spaces.c" \ > - "\"file::colons.c\"" \ > - "'file::colons.c'" \ > - "\"this \"file\" has quotes.c\"" \ > - "'this \"file\" has quotes.c'" \ > - "'this 'file' has quotes.c'" \ > - "\"this 'file' has quotes.c\"" \ > - "\"spaces: and :colons.c\"" \ > - "'more: :spaces: :and colons::.c'"] { > - # Remove any quoting from FILENAME for the error message. > - test_break "$x:3" invalid_file [string trim $x \"'] > -} > -foreach x [list "this_file_doesn't_exist.c" \ > - "file::colons.c" \ > - "'file::colons.c'"] { > - test_break "-source $x -line 3" \ > - invalid_file [string trim $x \"'] > -} > + # Test invalid filespecs starting with offset. This is done > + # first so that default offsets are tested. > + foreach x $invalid_offsets { > + set offset $x > + > + # Relative offsets are relative to line 16. Adjust > + # expected offset from error message accordingly. > + if {[string index $x 0] == "+" || [string index $x 0] == "-"} { > + incr offset 24 > + } > + test_break $x invalid_offset $offset > + test_break "-line $x" invalid_offset $offset > + } > + > + # Test offsets with trailing tokens w/ and w/o spaces. > + foreach x $spaces { > + test_break "3$x" unexpected "colon" > + test_break "+10$x" unexpected "colon" > + test_break "-10$x" unexpected "colon" > + } > + > + foreach x {1 +1 +100 -10} { > + test_break "3 $x" unexpected_opt "number" $x > + test_break "-line 3 $x" garbage $x > + test_break "+10 $x" unexpected_opt "number" $x > + test_break "-line +10 $x" garbage $x > + test_break "-10 $x" unexpected_opt "number" $x > + test_break "-line -10 $x" garbage $x > + } > > -# Test that option lexing stops at whitespace boundaries > -test_break "-source this file has spaces.c -line 3" \ > - invalid_file "this" > + foreach x {3 +10 -10} { > + test_break "$x foo" unexpected_opt "string" "foo" > + test_break "-line $x foo" garbage "foo" > + } > > -test_break "-function function whitespace" \ > - invalid_function "function" > + # Test invalid linespecs starting with filename. > + # It's OK to use the ".c" extension for the C++ test > + # since the extension doesn't affect GDB's lookup. > + set invalid_files [list "this_file_doesn't_exist.c" \ > + "this file has spaces.c" \ > + "\"file::colons.c\"" \ > + "'file::colons.c'" \ > + "\"this \"file\" has quotes.c\"" \ > + "'this \"file\" has quotes.c'" \ > + "'this 'file' has quotes.c'" \ > + "\"this 'file' has quotes.c\"" \ > + "\"spaces: and :colons.c\"" \ > + "'more: :spaces: :and colons::.c'" \ > + "C:/nonexist-with-windrive.c"] > + > + foreach x $invalid_files { > + # Remove any quoting from FILENAME for the error message. > + test_break "$x:3" invalid_file [string trim $x \"'] > + } > + foreach x [list "this_file_doesn't_exist.c" \ > + "file::colons.c" \ > + "'file::colons.c'"] { > + test_break "-source $x -line 3" invalid_file [string trim $x \"'] > + } > > -test_break "-source $srcfile -function function whitespace" \ > - invalid_function_f "function" $srcfile > + # Test that option lexing stops at whitespace boundaries > + test_break "-source this file has spaces.c -line 3" invalid_file "this" > + test_break "-function function whitespace" invalid_function "function" > + test_break "-source $srcfile -function function whitespace" \ > + invalid_function_f "function" $srcfile > > -test_break "-function main -label label whitespace" \ > - invalid_label "label" "main" > + test_break "-function main -label label whitespace" \ > + invalid_label "label" "main" > > -# Test unmatched quotes. > -foreach x {"\"src-file.c'" "'src-file.c"} { > - test_break "$x:3" unmatched_quote > -} > + # Test unmatched quotes. > + foreach x {"\"src-file.c'" "'src-file.c"} { > + test_break "$x:3" unmatched_quote > + } > > -test_break $srcfile invalid_function $srcfile > -foreach x {"foo" " foo" " foo "} { > - # Trim any leading/trailing whitespace for error messages. > - test_break "$srcfile:$x" invalid_function_f [string trim $x] $srcfile > - test_break "-source $srcfile -function $x" \ > - invalid_function_f [string trim $x] $srcfile > - test_break "$srcfile:main:$x" invalid_label [string trim $x] "main" > - test_break "-source $srcfile -function main -label $x" \ > - invalid_label [string trim $x] "main" > -} > + test_break $srcfile invalid_function $srcfile > + foreach x {"foo" " foo" " foo "} { > + # Trim any leading/trailing whitespace for error messages. > + test_break "$srcfile:$x" invalid_function_f [string trim $x] $srcfile > + test_break "-source $srcfile -function $x" \ > + invalid_function_f [string trim $x] $srcfile > + test_break "$srcfile:main:$x" invalid_label [string trim $x] "main" > + test_break "-source $srcfile -function main -label $x" \ > + invalid_label [string trim $x] "main" > + } > > -foreach x $spaces { > - test_break "$srcfile$x" unexpected "end of input" > - test_break "$srcfile:main$x" unexpected "end of input" > -} > + foreach x $spaces { > + test_break "$srcfile$x" unexpected "end of input" > + test_break "$srcfile:main$x" unexpected "end of input" > + } > > -test_break "${srcfile}::" invalid_function "${srcfile}::" > -test_break "$srcfile:3 1" unexpected_opt "number" "1" > -test_break "-source $srcfile -line 3 1" garbage "1" > -test_break "$srcfile:3 +100" unexpected_opt "number" "+100" > -test_break "-source $srcfile -line 3 +100" garbage "+100" > -test_break "$srcfile:3 -100" unexpected_opt "number" "-100" > -test_break "$srcfile:3 foo" unexpected_opt "string" "foo" > -test_break "-source $srcfile -line 3 foo" garbage "foo" > - > -foreach x $invalid_offsets { > - test_break "$srcfile:$x" invalid_offset_f $x $srcfile > - test_break "\"$srcfile:$x\"" invalid_offset_f $x $srcfile > - test_break "'$srcfile:$x'" invalid_offset_f $x $srcfile > - test_break "-source $srcfile -line $x" invalid_offset_f $x $srcfile > -} > -test_break "-source $srcfile -line -x" malformed_line_offset "-x" > + test_break "${srcfile}::" invalid_function "${srcfile}::" > + test_break "$srcfile:3 1" unexpected_opt "number" "1" > + test_break "-source $srcfile -line 3 1" garbage "1" > + test_break "$srcfile:3 +100" unexpected_opt "number" "+100" > + test_break "-source $srcfile -line 3 +100" garbage "+100" > + test_break "$srcfile:3 -100" unexpected_opt "number" "-100" > + test_break "$srcfile:3 foo" unexpected_opt "string" "foo" > + test_break "-source $srcfile -line 3 foo" garbage "foo" > + > + foreach x $invalid_offsets { > + test_break "$srcfile:$x" invalid_offset_f $x $srcfile > + test_break "\"$srcfile:$x\"" invalid_offset_f $x $srcfile > + test_break "'$srcfile:$x'" invalid_offset_f $x $srcfile > + test_break "-source $srcfile -line $x" invalid_offset_f $x $srcfile > + } > + test_break "-source $srcfile -line -x" malformed_line_offset "-x" > > -# Test invalid filespecs starting with function. > -foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \ > + # Test invalid filespecs starting with function. > + foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \ > "foo 0" "foo +10" "foo -10" "foo +100" "foo -100"} { > - test_break $x invalid_function $x > - test_break "-function \"$x\"" invalid_function $x > -} > + test_break $x invalid_function $x > + test_break "-function \"$x\"" invalid_function $x > + } > > -foreach x $spaces { > - test_break "main${x}there" invalid_label "there" "main" > - if {[test_compiler_info {clang-*-*}]} { setup_xfail clang/14500 *-*-* } > - test_break "main:here${x}" unexpected "end of input" > -} > + foreach x $spaces { > + test_break "main${x}there" invalid_label "there" "main" > + if {[test_compiler_info {clang-*-*}]} { > + setup_xfail clang/14500 *-*-* > + } > + test_break "main:here${x}" unexpected "end of input" > + } > > -foreach x {"3" "+100" "-100" "foo"} { > - test_break "main 3" invalid_function "main 3" > - test_break "-function \"main $x\"" invalid_function "main $x" > - test_break "main:here $x" invalid_label "here $x" "main" > - test_break "-function main -label \"here $x\"" \ > - invalid_label "here $x" "main" > -} > + foreach x {"3" "+100" "-100" "foo"} { > + test_break "main 3" invalid_function "main 3" > + test_break "-function \"main $x\"" invalid_function "main $x" > + test_break "main:here $x" invalid_label "here $x" "main" > + test_break "-function main -label \"here $x\"" \ > + invalid_label "here $x" "main" > + } > > -foreach x {"if" "task" "thread"} { > - test_break $x invalid_function $x > -} > + foreach x {"if" "task" "thread"} { > + test_break $x invalid_function $x > + } > > -test_break "'main.c'flubber" unexpected_opt "string" "flubber" > -test_break "'main.c',21" invalid_function "main.c" > -test_break "'main.c' " invalid_function "main.c" > -test_break "'main.c'3" unexpected_opt "number" "3" > -test_break "'main.c'+3" unexpected_opt "number" "+3" > + test_break "'main.c'flubber" unexpected_opt "string" "flubber" > + test_break "'main.c',21" invalid_function "main.c" > + test_break "'main.c' " invalid_function "main.c" > + test_break "'main.c'3" unexpected_opt "number" "3" > + test_break "'main.c'+3" unexpected_opt "number" "+3" > > -# Test undefined convenience variables. > -set x {$zippo} > -test_break $x invalid_var_or_func $x > -test_break "$srcfile:$x" invalid_var_or_func_f $x $srcfile > + # Test undefined convenience variables. > + set x {$zippo} > + test_break $x invalid_var_or_func $x > + test_break "$srcfile:$x" invalid_var_or_func_f $x $srcfile > > -# Explicit linespec-specific tests > -test_break "-source $srcfile" source_incomplete > + # Explicit linespec-specific tests > + test_break "-source $srcfile" source_incomplete > +} > + > +foreach_with_prefix lang {"C" "C++"} { > + do_test ${lang} > +} > diff --git a/gdb/testsuite/gdb.mi/mi-linespec-err-cp.cc b/gdb/testsuite/gdb.mi/mi-linespec-err-cp.cc > new file mode 100644 > index 0000000..19c92d8 > --- /dev/null > +++ b/gdb/testsuite/gdb.mi/mi-linespec-err-cp.cc > @@ -0,0 +1,35 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2016 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 . */ > + > +int > +myfunction (int aa) > +{ > + int i; > + > + i = aa + 42; > + return i; /* set breakpoint here */ > +} > + > +int > +main (void) > +{ > + int a; > + > + a = myfunction (a); > + > + return a; > +} > diff --git a/gdb/testsuite/gdb.mi/mi-linespec-err-cp.exp b/gdb/testsuite/gdb.mi/mi-linespec-err-cp.exp > new file mode 100644 > index 0000000..1a8682e > --- /dev/null > +++ b/gdb/testsuite/gdb.mi/mi-linespec-err-cp.exp > @@ -0,0 +1,57 @@ > +# Copyright 2016 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 . > + > +# Regression test for PR breakpoints/18303. Tests that the correct > +# errors is generated when setting a breakpoint in a non-existent > +# file with a Windows-style logical drive names and C++. > + > +if { [skip_cplus_tests] } { continue } > + > +load_lib mi-support.exp > +set MIFLAGS "-i=mi" > + > +standard_testfile .cc > +set exefile $testfile > + > +if {[prepare_for_testing $testfile $exefile $srcfile {debug c++}]} { > + return -1 > +} > + > +gdb_exit > +if [mi_gdb_start] { > + continue > +} > + > +# Turn off the pending breakpoint queries. > +mi_gdb_test "-interpreter-exec console \"set breakpoint pending off\"" \ > + {=cmd-param-changed,param=\"breakpoint pending\",.*\^done} \ > + "-interpreter-exec console \"set breakpoint pending off\"" > + > +mi_run_to_main > + > +# Run to a location in the file. > +set bp_location [gdb_get_line_number "set breakpoint here"] > + > +mi_gdb_test "-break-insert ${srcfile}:${bp_location}" \ > + {\^done,bkpt=.number="2",type="breakpoint".*\}} "set breakpoint" > + > +mi_execute_to "exec-continue" "breakpoint-hit" "myfunction" ".*" ".*" "24" \ > + { "" "disp=\"keep\"" } "breakpoint hit" > + > +# Set a breakpoint in a C++ source file whose name contains a > +# Windows-style logical drive. > +mi_gdb_test \ > + "-break-insert -f \"c:/uu.cpp:13\"" \ > + ".*No source file named c:/uu.cpp.*" > Ping? thanks --Don