From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31417 invoked by alias); 3 Mar 2020 13:39:23 -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 31408 invoked by uid 89); 3 Mar 2020 13:39:23 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=liberty, holding, philippe X-HELO: mail-wm1-f66.google.com Received: from mail-wm1-f66.google.com (HELO mail-wm1-f66.google.com) (209.85.128.66) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 03 Mar 2020 13:39:21 +0000 Received: by mail-wm1-f66.google.com with SMTP id j1so1429981wmi.4 for ; Tue, 03 Mar 2020 05:39:21 -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=GBUge295RopPmDvKrBeK494QU21exrI9YCxVGCJt218=; b=Mns6dlZ/p1xN/rClVz3ds07cPPTuPtmmo6r5UqamMEdv6CC4QFnq+X9jebayMbKxYT 9MGZq8TB19G9umHxc4JBmePE0fN4XHR25i59ul7wsACly1niy5nmp7VWhnEqBrdFVeEi 0SPyborz//AM3PRYlD5GrV6TiGGfz79NQ0zk5JX8hpIOVpUZWBT9KobShP4MtaynEKyl EyfmTFGlV2wEoAxKH9hyNnGpVQTIHdii2Lxw3VY1vIEqEKVC1Z7bVgyWAMLxc+PG4PtT S8Guet4/kcp9tSGGfRqLrRyjgeUfndiaRexW39G80vBLGQtZnxF3w6cj5V/pUVJxp/Xl FGDw== Return-Path: Received: from localhost ([212.69.42.53]) by smtp.gmail.com with ESMTPSA id t1sm36953832wrs.41.2020.03.03.05.39.18 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Mar 2020 05:39:18 -0800 (PST) Date: Tue, 03 Mar 2020 13:39:00 -0000 From: Andrew Burgess To: Sergio Durigan Junior Cc: GDB Patches , Philippe Waroquiers , Pedro Alves Subject: Re: [PATCH] Fix printf of a convenience variable holding an inferior address Message-ID: <20200303133918.GV3317@embecosm.com> References: <20190610211622.15237-1-philippe.waroquiers@skynet.be> <20200302024616.1049417-1-sergiodj@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200302024616.1049417-1-sergiodj@redhat.com> X-Fortune: A sadist is a masochist who follows the Golden Rule. X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.9.2 (2017-12-15) X-IsSubscribed: yes X-SW-Source: 2020-03/txt/msg00054.txt * Sergio Durigan Junior [2020-03-01 21:46:16 -0500]: > Back at: > > commit 1f6f6e21fa86dc3411a6498608f32e9eb24b7851 > Author: Philippe Waroquiers > Date: Mon Jun 10 21:41:51 2019 +0200 > > Ensure GDB printf command can print convenience var strings without a target. > > GDB was extended in order to allow the printing of convenience > variables that are strings without a target. However, this introduced > a regression that hasn't been caught by our testsuite (because there > were no tests for it). > > The problem happens when we try to print a convenience variable that > holds the address of a string in the inferior. The following > two-liners can reproduce the issue: > > $ echo -e 'int main(){const char a[]="test";return 0;}' | gcc -x c - -O0-g3 > $ ./gdb/gdb --data-directory ./gdb/data-directory -q ./a.out -ex 'start' -ex 'set $x = (const char *) (&a[0] + 2)' -ex 'printf "%s\n", $x' > > After some investigation, I found that the problem happens on > printcmd.c:printf_c_string. In the case above, we're taking the first > branch of the 'if' condition, which assumes that there will be a value > to be printed at "value_contents (value)". There isn't. We actually > need to obtain the address that the variable points to, and read the > contents from memory. > > It seems to me that we should avoid this branch if the TYPE_CODE of > "value_type (value)" is TYPE_CODE_PTR (i.e., a pointer to the > inferior's memory). This is what this patch does. > > I took the liberty to extend the current testcase under > gdb.base/printcmds.exp and create a test that exercises this scenario. > > No regressions have been found on Buildbot. > > gdb/ChangeLog: > 2020-03-02 Sergio Durigan Junior > > * printcmd.c (print_c_string): Check also for TYPE_CODE_PTR > when verifying if dealing with a convenience variable. > > gdb/testsuite/ChangeLog: > 2020-03-02 Sergio Durigan Junior > > * gdb.base/printcmds.exp: Add test to verify printf of a > variable holding an address. LGTM. Thanks, Andrew > --- > gdb/printcmd.c | 3 ++- > gdb/testsuite/gdb.base/printcmds.exp | 8 ++++++++ > 2 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/gdb/printcmd.c b/gdb/printcmd.c > index 797041484e..78d8d3d81e 100644 > --- a/gdb/printcmd.c > +++ b/gdb/printcmd.c > @@ -2260,7 +2260,8 @@ printf_c_string (struct ui_file *stream, const char *format, > { > const gdb_byte *str; > > - if (VALUE_LVAL (value) == lval_internalvar > + if (TYPE_CODE (value_type (value)) != TYPE_CODE_PTR > + && VALUE_LVAL (value) == lval_internalvar > && c_is_string_type_p (value_type (value))) > { > size_t len = TYPE_LENGTH (value_type (value)); > diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp > index bd2afc8696..c87a1517f0 100644 > --- a/gdb/testsuite/gdb.base/printcmds.exp > +++ b/gdb/testsuite/gdb.base/printcmds.exp > @@ -1039,6 +1039,14 @@ gdb_test_no_output "set may-call-functions off" > test_printf_convenience_var "with target, may-call-functions off" > gdb_test_no_output "set may-call-functions on" > > +# Test printf of a variable that holds the address to a substring in > +# the inferior. This test will not work without a target. > +gdb_test_no_output "set var \$test_substr = \(char \*\) \(&teststring\[0\] + 4\)" \ > + "set \$test_substr var" > +gdb_test "printf \"test_substr val = %s\\n\", \$test_substr" \ > + "test_substr val = string contents" \ > + "print \$test_substr" > + > test_integer_literals_accepted > test_integer_literals_rejected > test_float_accepted > -- > 2.24.1 >