From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 105856 invoked by alias); 25 Feb 2016 17:28:03 -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 105831 invoked by uid 89); 25 Feb 2016 17:28:02 -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,SPF_PASS autolearn=ham version=3.3.2 spammy=384, concept, iff, indexed 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, 25 Feb 2016 17:27:59 +0000 Received: from svr-orw-fem-04.mgc.mentorg.com ([147.34.97.41]) by relay1.mentorg.com with esmtp id 1aYzhj-0000Ow-TZ from Don_Breazeal@mentor.com for gdb-patches@sourceware.org; Thu, 25 Feb 2016 09:27:55 -0800 Received: from [172.30.2.193] (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; Thu, 25 Feb 2016 09:27:55 -0800 Subject: Re: [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> <56B39A52.9010203@codesourcery.com> <56C609E5.3060506@codesourcery.com> From: Don Breazeal Message-ID: <56CF3992.7000200@codesourcery.com> Date: Thu, 25 Feb 2016 17:28: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: <56C609E5.3060506@codesourcery.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2016-02/txt/msg00811.txt.bz2 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: >> 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 >> >