Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Burgess <andrew.burgess@embecosm.com>
To: Sergio Durigan Junior <sergiodj@redhat.com>
Cc: GDB Patches <gdb-patches@sourceware.org>,
	Philippe Waroquiers <philippe.waroquiers@skynet.be>,
	Pedro Alves <palves@redhat.com>
Subject: Re: [PATCH] Fix printf of a convenience variable holding an inferior address
Date: Tue, 03 Mar 2020 13:39:00 -0000	[thread overview]
Message-ID: <20200303133918.GV3317@embecosm.com> (raw)
In-Reply-To: <20200302024616.1049417-1-sergiodj@redhat.com>

* Sergio Durigan Junior <sergiodj@redhat.com> [2020-03-01 21:46:16 -0500]:

> Back at:
> 
> commit 1f6f6e21fa86dc3411a6498608f32e9eb24b7851
> Author: Philippe Waroquiers <philippe.waroquiers@skynet.be>
> 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  <sergiodj@redhat.com>
> 
> 	* 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  <sergiodj@redhat.com>
> 
> 	* 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
> 


  reply	other threads:[~2020-03-03 13:39 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-10 21:16 [RFA] Ensure GDB printf command can print convenience var strings without a target Philippe Waroquiers
2019-06-11  2:29 ` Eli Zaretskii
2019-07-05 20:01 ` PING " Philippe Waroquiers
2019-07-08 18:13 ` Pedro Alves
2019-07-08 22:41   ` Philippe Waroquiers
2019-07-09  4:36     ` New FAIL on gdb.base/printcmds.exp (was: Re: [RFA] Ensure GDB printf command can print convenience var strings without a target.) Sergio Durigan Junior
2020-03-02  2:46 ` [PATCH] Fix printf of a convenience variable holding an inferior address Sergio Durigan Junior
2020-03-03 13:39   ` Andrew Burgess [this message]
2020-03-03 16:29     ` Sergio Durigan Junior
2020-03-03 16:49       ` Sergio Durigan Junior
2020-03-04 10:53         ` Joel Brobecker
     [not found]           ` <8736al5d8s.fsf@redhat.com>
2020-03-07 11:58             ` Joel Brobecker
2020-03-09 22:56               ` Sergio Durigan Junior
2020-03-10 22:37                 ` Joel Brobecker
2020-03-10 22:57                   ` Sergio Durigan Junior
2020-03-10 23:13                     ` Andreas Schwab
2020-03-10 23:38                       ` Sergio Durigan Junior
2020-03-11 16:34                   ` Sergio Durigan Junior

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200303133918.GV3317@embecosm.com \
    --to=andrew.burgess@embecosm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.com \
    --cc=philippe.waroquiers@skynet.be \
    --cc=sergiodj@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox