public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Enze Li <enze.li@hotmail.com>
To: gdb-patches@sourceware.org
Cc: enze.li@gmx.com
Subject: [PATCH] gdb: add a numeric check after the exponent (PR cli/24124)
Date: Sun,  4 Sep 2022 16:36:01 +0800	[thread overview]
Message-ID: <OS3P286MB2152D905FE0BAF74185E6CE1F07C9@OS3P286MB2152.JPNP286.PROD.OUTLOOK.COM> (raw)

PR cli/24124 points out that `b *804874d` or `b *804874f` gives output
`Invalid number "804874d".` or `Invalid number "804874f".`  And the
output of `b *804874e` is `Breakpoint 1 at 0xc480a`.

That is to say, when "e" or "E" appears after a decimal value, it will
be incorrectly parsed as a floating point number.  Importantly, this
parsing is not consistent with the C language.

The initial idea was to perform a "0x" or "0X" check of the address.
But Tom pointed out that the text after the "*" is an arbitrary
expression, not just an integer.  Therefore, I realized that this idea
was going in the wrong direction.

After digging a bit deeper, I found that the root cause of this problem
is that the lex_one_token function doesn't check for the case where the
exponent has no digits.  If we check this, GDB will not continue parsing
the invalid numbers.

Before this patch applied, things like

  (gdb) b *804874d
  Invalid number "804874d".
  (gdb) b *804874e
  Breakpoint 1 at 0xc480a
  (gdb) print 80d
  Invalid number "80d".
  (gdb) ptype 80d
  Invalid number "80d".
  (gdb) print 80e
  $1 = 80
  (gdb) ptype 80e
  type = double

The new behavior is

  (gdb) b *804874d
  Invalid number "804874d".
  (gdb) b *804874e
  Invalid number "804874e".
  (gdb) print 80d
  Invalid number "80d".
  (gdb) ptype 80d
  Invalid number "80d".
  (gdb) print 80e
  Invalid number "80e".
  (gdb) ptype 80e
  Invalid number "80e".

Tested on x86_64-linux.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24124
---
 gdb/c-exp.y                         | 3 ++-
 gdb/testsuite/gdb.base/commands.exp | 7 +++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 61a61fcba09c..b13de967b1b6 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -2769,7 +2769,8 @@ lex_one_token (struct parser_state *par_state, bool *is_quoted_name)
 	    /* This test includes !hex because 'e' is a valid hex digit
 	       and thus does not indicate a floating point number when
 	       the radix is hex.  */
-	    if (!hex && !got_e && !got_p && (*p == 'e' || *p == 'E'))
+	    if (!hex && !got_e && !got_p && (*p == 'e' || *p == 'E')
+	        && p[1] >= '0' && p[1] <= '9')
 	      got_dot = got_e = 1;
 	    else if (!got_e && !got_p && (*p == 'p' || *p == 'P'))
 	      got_dot = got_p = 1;
diff --git a/gdb/testsuite/gdb.base/commands.exp b/gdb/testsuite/gdb.base/commands.exp
index 3eb4463cd1a5..ca30b757e38a 100644
--- a/gdb/testsuite/gdb.base/commands.exp
+++ b/gdb/testsuite/gdb.base/commands.exp
@@ -278,6 +278,13 @@ proc_with_prefix breakpoint_command_test {} {
     gdb_test "continue" \
 	    "Breakpoint \[0-9\]*, factorial.*Now the value is 5"
     gdb_test "print value" " = 5"
+
+    gdb_test "break *804874d" "Invalid number.*" "804874d is an invalid number"
+    gdb_test "break *804874e" "Invalid number.*" "804874e is an invalid number"
+    gdb_test "print 80d" "Invalid number.*" "(print) 80d is an invalid number"
+    gdb_test "ptype 80d" "Invalid number.*" "(ptype) 80d is an invalid number"
+    gdb_test "print 80e" "Invalid number.*" "(print) 80e is an invalid number"
+    gdb_test "ptype 80e" "Invalid number.*" "(ptype) 80e is an invalid number"
 }
 
 # Test clearing the commands of several breakpoints with one single "end".
-- 
2.37.2


             reply	other threads:[~2022-09-04  8:36 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-04  8:36 Enze Li [this message]
2022-09-04  8:42 ` Andreas Schwab
2022-09-04 10:01   ` Enze Li
2022-09-05 13:57 ` [PATCH v2] " Enze Li
2022-09-21 18:12   ` Tom Tromey
2022-09-22 14:09     ` Enze Li
2022-09-23 13:47       ` Tom Tromey
2022-10-02 12:15         ` Enze Li

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=OS3P286MB2152D905FE0BAF74185E6CE1F07C9@OS3P286MB2152.JPNP286.PROD.OUTLOOK.COM \
    --to=enze.li@hotmail.com \
    --cc=enze.li@gmx.com \
    --cc=gdb-patches@sourceware.org \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).