From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 92358 invoked by alias); 14 Mar 2016 21:23:57 -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 92343 invoked by uid 89); 14 Mar 2016 21:23:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_20,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=sk:checkpo, UD:checkpoint-ns.exp, 157, foobar 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 (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 14 Mar 2016 21:23:46 +0000 Received: from svr-orw-fem-04.mgc.mentorg.com ([147.34.97.41]) by relay1.mentorg.com with esmtp id 1afZxn-0003Zk-Oo from Don_Breazeal@mentor.com ; Mon, 14 Mar 2016 14:23:43 -0700 Received: from [172.30.4.244] (147.34.91.1) by SVR-ORW-FEM-04.mgc.mentorg.com (147.34.97.41) with Microsoft SMTP Server (TLS) id 14.3.224.2; Mon, 14 Mar 2016 14:23:43 -0700 Subject: Re: [PING] Re: [PATCH v4] PR 18303, Tolerate malformed input for lookup_symbol-called functions (was: Re: [PATCH] Fix problem handling colon in linespec, PR breakpoints/18303) To: , Pedro Alves References: <1454021528-7073-1-git-send-email-donb@codesourcery.com> <56B39A52.9010203@codesourcery.com> <56C609E5.3060506@codesourcery.com> <56CF3992.7000200@codesourcery.com> <56D88019.7040105@codesourcery.com> From: Don Breazeal Message-ID: <56E72BCE.8090701@codesourcery.com> Date: Mon, 14 Mar 2016 21:23:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <56D88019.7040105@codesourcery.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2016-03/txt/msg00221.txt.bz2 On 1/28/2016 4:06 AM, Pedro Alves wrote: > On 01/28/2016 01:21 AM, Don Breazeal wrote: >> 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. > .... >> gdb/testsuite/gdb.linespec/ls-errs-cp.cc | 36 +++++ >> gdb/testsuite/gdb.linespec/ls-errs-cp.exp | 240 ++++++++++++++++++++++++++++ > ... > > Can't we somehow reuse the existing test? Say, either: > > - move the main body of ls-errs.exp a procedure, and call it twice, > once for each language, or, > > - make gdb.linespec/ls-errs-cp.exp set some $language var and then > source gdb.linespec/ls-errs.exp, like gdb.base/checkpoint-ns.exp. > > Thanks, > Pedro Alves > Hi Pedro, I used your first suggestion above. Did you have any other comments for this one, or is it good to go? Thanks, --Don On 3/3/2016 10:19 AM, Don Breazeal wrote: > Ping. > I checked, the patch still applies cleanly to mainline. > Thanks > --Don > > On 2/25/2016 9:27 AM, Don Breazeal wrote: >> Ping >> Thanks >> --Don >> >> On 2/18/2016 10:13 AM, Don Breazeal wrote: >>> Ping. >>> Current status of this one: >>> - Doug approved (at least in concept) Keith's fix below. >>> - Pedro requested that the new C++ linespec error test be consolidated >>> with the existing C version of the test. That's done in this version. >>> Thanks! >>> --Don >>> >>> On 2/4/2016 10:37 AM, Don Breazeal wrote: >>>> Ping? >>>> thanks >>>> --Don >>>> >>>> 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.*" >>>>> >>>> >>> >> >