From patchwork Wed Feb 19 14:11:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 38225 Received: (qmail 61134 invoked by alias); 19 Feb 2020 14:11:20 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 61120 invoked by uid 89); 19 Feb 2020 14:11:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=prepare X-HELO: mail-wr1-f65.google.com Received: from mail-wr1-f65.google.com (HELO mail-wr1-f65.google.com) (209.85.221.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 19 Feb 2020 14:11:17 +0000 Received: by mail-wr1-f65.google.com with SMTP id w12so740150wrt.2 for ; Wed, 19 Feb 2020 06:11:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=XB7RZGswxIK7ebNB4itoVmW/gx5Z2de5o7HQTKO4M4E=; b=E8OdL4Xo5AmCKwXgV2Cds/GlbMFByN7Qnds1MBc358yIiZGpCJecX8x24xnyJnOBm7 OVf2MzUGUKYlTh8r5bDvHdzBks1muslbhjTOr48M2MIABdUHZjDoLHAZJDrHnVKzuZmk UZykNmqZWycB68n61XHoxbWMKhQE/vicpUv0b7fgmK2z9VLe/wGKwOz4uu7EymMBAV8g 080ypQwt/00BFPNinbSel/5Z3pIZy10UtW7idD2doWkeh3LqCm9y2La06gVAbV3/c0qk AJT4lU4jRtJnUiwXt2kZdCE6krFYyVE96rtnSYTYKoDwYhgG8Jd+vxce2dbOiWpSiPyV THnA== Return-Path: Received: from localhost (host86-186-80-160.range86-186.btcentralplus.com. [86.186.80.160]) by smtp.gmail.com with ESMTPSA id c13sm3132738wrn.46.2020.02.19.06.11.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 19 Feb 2020 06:11:14 -0800 (PST) Date: Wed, 19 Feb 2020 14:11:13 +0000 From: Andrew Burgess To: Simon Marchi Cc: Keith Moyer , Ali Tamur , gdb-patches@sourceware.org Subject: Re: [PATCH] Check for null result from gdb_demangle Message-ID: <20200219141113.GB3317@embecosm.com> References: <20200213063140.129700-1-tamur@google.com> <20200213105257.GT4020@embecosm.com> <20200218103934.GA3317@embecosm.com> <23246298-d222-0720-80b6-13857c287bd1@simark.ca> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <23246298-d222-0720-80b6-13857c287bd1@simark.ca> X-Fortune: : is not an identifier X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.9.2 (2017-12-15) X-IsSubscribed: yes * Simon Marchi [2020-02-18 14:54:54 -0500]: > On 2020-02-18 5:39 a.m., Andrew Burgess wrote: > > * Keith Moyer [2020-02-13 11:20:46 -0800]: > > > >> On Thu, Feb 13, 2020 at 2:52 AM Andrew Burgess > >> wrote: > >> > >>> If you are able to find an example of a symbol that triggers the crash > >>> > >> > >> The symbol where I ran into the problem was "". I see references to > >> this in GCC sources, but I'm not entirely clear on when this is emitted > >> instead of "", "", "", or > >> similar. > >> > >> then it should be pretty easy to add a test, see for example the last > >>> few lines of gdb.cp/demangle.exp for C++ demangling tests. Having a > >>> test would help something like this happening again. > >>> > >> > >> Given that the bug here is that this code doesn't check for the possibility > >> that gdb_demangle can fail (not that it failed), what kind of test would > >> you recommend (and where)? > > > > You're absolutely right. Sorry for the confusion. I withdraw my > > request. > > I might be missing something, but shouldn't it be possible to write a test > in gdb.dwarf2 that creates a struct with linkage name (or any > undemanglable identifier) and exercise this? Yes. Sorry, I think I must be having a bad week. Ali, Please find below a test for this bug. If Pedro's points have been addressed then please feel free to commit this test and the fix as a single commit to GDB. Thanks, Andrew ---- commit e45daded868575ab25178c45cb075d2f77f244a6 Author: Andrew Burgess Date: Wed Feb 19 14:06:45 2020 +0000 gdb/testsuite: New test for demangle issue gdb/testsuite/ChangeLog: * gdb.dwarf2/cpp-linkage-name.c: New file. * gdb.dwarf2/cpp-linkage-name.exp: New file. diff --git a/gdb/testsuite/gdb.dwarf2/cpp-linkage-name.c b/gdb/testsuite/gdb.dwarf2/cpp-linkage-name.c new file mode 100644 index 00000000000..c28dece9c38 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/cpp-linkage-name.c @@ -0,0 +1,29 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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 . */ + +volatile struct +{ + int x; + int y; +} global_var; + +int +main (void) +{ + asm ("main_label: .globl main_label"); + return global_var.x + global_var.y; +} diff --git a/gdb/testsuite/gdb.dwarf2/cpp-linkage-name.exp b/gdb/testsuite/gdb.dwarf2/cpp-linkage-name.exp new file mode 100644 index 00000000000..414b43a7dd9 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/cpp-linkage-name.exp @@ -0,0 +1,96 @@ +# Copyright 2020 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 . + +# Some compilers give anonymous structures a linkage name, and that +# linkage name doesn't demangle (within GDB calling gdb_demangle +# return NULL). At one point this caused GDB to crash due to +# dereferencing a NULL pointer. + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +standard_testfile cpp-linkage-name.c cpp-linkage-name-debug.S + +# Set up the DWARF for the test. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + global srcdir subdir srcfile + + lassign [function_range main ${srcdir}/${subdir}/${srcfile}] \ + main_start main_length + + cu {} { + DW_TAG_compile_unit { + {DW_AT_language @DW_LANG_C_plus_plus} + {DW_AT_name ada-linkage-name.c} + {DW_AT_comp_dir /tmp} + + } { + declare_labels a_l b_l + + a_l: DW_TAG_base_type { + {DW_AT_byte_size 4 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name int} + } + + # To expose the bug that existed at one point this + # structure must have a linkage name, but no name, and the + # linkage name is something that doesn't demangle. + b_l: DW_TAG_structure_type { + {DW_AT_byte_size 8 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_linkage_name } + } { + member { + {name x} + {type :$a_l} + {data_member_location 0 data1} + } + member { + {name y} + {type :$a_l} + {data_member_location 0 data1} + } + } + DW_TAG_subprogram { + {name "main"} + {low_pc $main_start addr} + {high_pc "$main_start + $main_length" addr} + {type :$a_l} + } + DW_TAG_variable { + {type :$b_l} + {external 1 flag} + {DW_AT_name global_var} + {DW_AT_location { + DW_OP_addr [gdb_target_symbol global_var] + } SPECIAL_expr} + } + } + } +} + +if { [prepare_for_testing "failed to prepare" ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +gdb_assert [runto_main] "run to main" +gdb_test "p global_var" " = {x = 0, y = 0}"