From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19873 invoked by alias); 17 Dec 2002 01:30:54 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 19762 invoked from network); 17 Dec 2002 01:30:53 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 17 Dec 2002 01:30:53 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id gBH14mg06057 for ; Mon, 16 Dec 2002 20:04:48 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id gBH1Uq215425; Mon, 16 Dec 2002 20:30:52 -0500 Received: from localhost.redhat.com (romulus-int.sfbay.redhat.com [172.16.27.46]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id gBH1UnL19135; Mon, 16 Dec 2002 20:30:50 -0500 Received: by localhost.redhat.com (Postfix, from userid 469) id 49DF3FF79; Mon, 16 Dec 2002 20:35:20 -0500 (EST) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15870.32600.44108.290261@localhost.redhat.com> Date: Mon, 16 Dec 2002 18:02:00 -0000 To: David Carlton Cc: gdb-patches@sources.redhat.com, Elena Zannoni , Jim Blandy , Fernando Nasser Subject: Re: [rfa+testsuite] don't search off the end of partial symbol tables In-Reply-To: References: X-SW-Source: 2002-12/txt/msg00507.txt.bz2 David Carlton writes: > It turns out that the binary search in lookup_partial_symbol isn't too > careful about array boundaries: it looks for the first partial symbol > with the appropriate name (if there is one), and then looks, starting > at that position, for the partial symbol that is in the correct > namespace. It stops when it finds a match or when it finds a symbol > with the wrong name. > > So if you construct a partial symbol table whose last element has the > name you're looking for but is in the wrong namespace, then GDB will > read off the end of the psymtab. > Ahh. Good catch. > The robustness of GDB with respect to partial symbol errors is a > constant sources of joy and delight. Or something. Jim: you'll be > happy to learn that I found this bug while running gdb.c++/psmang.exp > on a branch. > > Here's a patch, and a test to catch it. This patch is completely > orthogonal to (and much less important than) other patches of mine > that are awaiting review. > Yes, sorry, but also easier to review... :-) OK. Wait for Fernando's word on the tests. Elena > David Carlton > carlton@math.stanford.edu > > 2002-12-16 David Carlton > > * symtab.c (lookup_partial_symbol): Don't search past the end of > the partial symbols. > > 2002-12-16 David Carlton > > * gdb.base/psymtab.exp: New file. > * gdb.base/psymtab1.c: Ditto. > * gdb.base/psymtab2.c: Ditto. > > Index: symtab.c > =================================================================== > RCS file: /cvs/src/src/gdb/symtab.c,v > retrieving revision 1.81 > diff -u -p -r1.81 symtab.c > --- symtab.c 5 Dec 2002 21:26:57 -0000 1.81 > +++ symtab.c 17 Dec 2002 00:33:20 -0000 > @@ -1300,7 +1300,7 @@ lookup_partial_symbol (struct partial_sy > { > struct partial_symbol *temp; > struct partial_symbol **start, **psym; > - struct partial_symbol **top, **bottom, **center; > + struct partial_symbol **top, **real_top, **bottom, **center; > int length = (global ? pst->n_global_syms : pst->n_static_syms); > int do_linear_search = 1; > > @@ -1323,6 +1323,7 @@ lookup_partial_symbol (struct partial_sy > > bottom = start; > top = start + length - 1; > + real_top = top; > while (top > bottom) > { > center = bottom + (top - bottom) / 2; > @@ -1348,7 +1349,7 @@ lookup_partial_symbol (struct partial_sy > /* djb - 2000-06-03 - Use SYMBOL_MATCHES_NAME, not a strcmp, so > we don't have to force a linear search on C++. Probably holds true > for JAVA as well, no way to check.*/ > - while (SYMBOL_MATCHES_NAME (*top,name)) > + while (top <= real_top && SYMBOL_MATCHES_NAME (*top,name)) > { > if (SYMBOL_NAMESPACE (*top) == namespace) > { > Index: gdb.base/psymtab.exp > --- /dev/null Thu Apr 11 07:25:15 2002 > +++ /extra/gdb/working/src/gdb/testsuite/gdb.base/psymtab.exp Mon Dec 16 16:44:17 2002 > @@ -0,0 +1,72 @@ > +# Copyright 2002 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 2 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, write to the Free Software > +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. > + > +# Please email any bugs, comments, and/or additions to this file to: > +# bug-gdb@prep.ai.mit.edu > + > +# This file is part of the gdb testsuite > + > +# This is intended to be a repository for tests that partial symbols > +# are working properly. If multiple tests are added, make sure that > +# you exit and restart GDB between tests. > + > +if $tracelevel then { > + strace $tracelevel > +} > + > +# > +# test running programs > +# > + > +set prms_id 0 > +set bug_id 0 > + > +if { [skip_cplus_tests] } { continue } > + > +set testfile "psymtab" > +set binfile ${objdir}/${subdir}/${testfile} > + > +if { [gdb_compile "${srcdir}/${subdir}/${testfile}1.c" "${testfile}1.o" object {debug}] != "" } { > + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." > +} > + > +if { [gdb_compile "${srcdir}/${subdir}/${testfile}2.c" "${testfile}2.o" object {debug}] != "" } { > + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." > +} > + > +if { [gdb_compile "${testfile}1.o ${testfile}2.o" ${binfile} executable {debug}] != "" } { > + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." > +} > + > +# Create and source the file that provides information about the compiler > +# used to compile the test case. > +if [get_compiler_info ${binfile}] { > + return -1; > +} > + > +gdb_exit > +gdb_start > +gdb_reinitialize_dir $srcdir/$subdir > +gdb_load ${binfile} > + > +# This test is looking for a bug that manifested itself when GDB was > +# looking for a partial symbol such that there wasn't such a partial > +# symbol in the psymtab, but such that the last psym in the psymtab > +# had the right name but the wrong namespace. Here, searching for > +# zzz::dummy currently causes a search for 'zzz' in STRUCT_NAMESPACE > +# without a preceding search for 'zzz' in VAR_NAMESPACE. > + > +gdb_test "break zzz::dummy" "Can't find member of namespace, class, struct, or union named \"zzz::dummy\"\r\n.*" "Don't search past end of psymtab." > Index: gdb.base/psymtab1.c > --- /dev/null Thu Apr 11 07:25:15 2002 > +++ /extra/gdb/working/src/gdb/testsuite/gdb.base/psymtab1.c Mon Dec 16 16:29:37 2002 > @@ -0,0 +1,4 @@ > +int main () > +{ > + return 0; > +} > Index: gdb.base/psymtab2.c > --- /dev/null Thu Apr 11 07:25:15 2002 > +++ /extra/gdb/working/src/gdb/testsuite/gdb.base/psymtab2.c Mon Dec 16 16:29:49 2002 > @@ -0,0 +1,3 @@ > +extern int zzz; > + > +int zzz = 123;