public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [patch] Handle 0 result from sscanf when parsing fp values.
@ 2010-08-17  0:31 Doug Evans
  2010-08-17  8:18 ` Andreas Schwab
  0 siblings, 1 reply; 15+ messages in thread
From: Doug Evans @ 2010-08-17  0:31 UTC (permalink / raw)
  To: gdb-patches

Hi.

I was getting an internal error from "p 0x1.1".

(gdb) p 0x1.1
gdb/gdbtypes.c:1385: internal-error: check_typedef: Assertion `type' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.

This is due to sscanf returning 0 and c-exp.y:parse_number not handling it.
NOTE: Not all glibc's trigger this, and you have to do "p 0x1.1" first,
otherwise the global yylval (c_lval) variable will just get reused,
and no crash (or error!).

I will commit the following in two days if there are no objections.

NOTE: This patch uses gdb_assert_not_reached.
ref: http://sourceware.org/ml/gdb-patches/2010-08/msg00250.html


2010-08-16  Doug Evans  <dje@google.com>

	* c-exp.y (parse_number): Handle 0 result from sscanf.
	* objc-exp.y (parse_number): Ditto.

	testsuite/
	* gdb.base/printcmds.exp (test_float_literals_rejected): New proc.
	Call it to test handling of bad floating point numbers.
	* gdb.objc/printcmds.exp: New file.

Index: c-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/c-exp.y,v
retrieving revision 1.76
diff -u -p -u -p -r1.76 c-exp.y
--- c-exp.y	28 Jun 2010 20:18:26 -0000	1.76
+++ c-exp.y	17 Aug 2010 00:17:29 -0000
@@ -1371,12 +1371,18 @@ parse_number (char *p, int len, int pars
 		    &putithere->typed_val_float.dval, s);
       p[len] = saved_char;	/* restore the input stream */
 
-      if (num == 1)
-	putithere->typed_val_float.type = 
-	  parse_type->builtin_double;
-
-      if (num == 2 )
+      switch (num)
 	{
+	case 0:
+	  free (s);
+	  return ERROR;
+
+	case 1:
+	  putithere->typed_val_float.type = 
+	    parse_type->builtin_double;
+	  break;
+
+	case 2:
 	  /* See if it has any float suffix: 'f' for float, 'l' for long 
 	     double.  */
 	  if (!strcasecmp (s, "f"))
@@ -1390,6 +1396,10 @@ parse_number (char *p, int len, int pars
 	      free (s);
 	      return ERROR;
 	    }
+	  break;
+
+	default:
+	  gdb_assert_not_reached ("unexpected sscanf result");
 	}
 
       free (s);
Index: objc-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/objc-exp.y,v
retrieving revision 1.38
diff -u -p -u -p -r1.38 objc-exp.y
--- objc-exp.y	5 Mar 2010 20:18:14 -0000	1.38
+++ objc-exp.y	17 Aug 2010 00:17:29 -0000
@@ -1016,8 +1016,9 @@ parse_number (p, len, parsed_float, puti
 
       /* It's a float since it contains a point or an exponent.  */
 
-      sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
-	      &putithere->typed_val_float.dval, &c);
+      if (sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
+		  &putithere->typed_val_float.dval, &c) != 1)
+	return ERROR;
 
       /* See if it has `f' or `l' suffix (float or long double).  */
 
Index: testsuite/gdb.base/printcmds.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/printcmds.exp,v
retrieving revision 1.35
diff -u -p -u -p -r1.35 printcmds.exp
--- testsuite/gdb.base/printcmds.exp	21 Jul 2010 18:08:27 -0000	1.35
+++ testsuite/gdb.base/printcmds.exp	17 Aug 2010 00:17:29 -0000
@@ -146,6 +146,10 @@ proc test_integer_literals_rejected {} {
     test_print_reject "p 0b12" 
 }
 
+proc test_float_literals_rejected {} {
+    test_print_reject "p 0x1.1"
+}
+
 proc test_print_all_chars {} {
     global gdb_prompt
 
@@ -794,6 +798,7 @@ if [set_lang_c] then {
     if [runto_main] then {
 	test_integer_literals_accepted
 	test_integer_literals_rejected
+	test_float_literals_rejected
 	test_character_literals_accepted
 	test_print_all_chars
 	test_print_repeats_10
Index: testsuite/gdb.objc/printcmds.exp
===================================================================
RCS file: testsuite/gdb.objc/printcmds.exp
diff -N testsuite/gdb.objc/printcmds.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.objc/printcmds.exp	17 Aug 2010 00:17:29 -0000
@@ -0,0 +1,53 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2010 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 <http://www.gnu.org/licenses/>.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@gnu.org
+
+if $tracelevel {
+    strace $tracelevel
+}
+
+# Set the current language to Objective-C.  This counts as a test.  If it
+# fails, then we skip the other tests.
+
+proc set_lang_objc {} {
+    global gdb_prompt
+
+    if [gdb_test_no_output "set language objective-c" "set language objective-c"] {
+	return 0
+    }
+
+    if [gdb_test "show language" ".* source language is \"objective-c\".*"] {
+	return 0
+    }
+    return 1;
+}
+
+proc test_float_literals_rejected {} {
+    test_print_reject "p 0x1.1"
+}
+
+# Start with a fresh gdb.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+
+if [set_lang_objc] {
+    test_float_literals_rejected
+}

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Handle 0 result from sscanf when parsing fp values.
  2010-08-17  0:31 [patch] Handle 0 result from sscanf when parsing fp values Doug Evans
@ 2010-08-17  8:18 ` Andreas Schwab
  2010-08-17 11:37   ` Doug Evans
  0 siblings, 1 reply; 15+ messages in thread
From: Andreas Schwab @ 2010-08-17  8:18 UTC (permalink / raw)
  To: Doug Evans; +Cc: gdb-patches

dje@google.com (Doug Evans) writes:

> Index: objc-exp.y
> ===================================================================
> RCS file: /cvs/src/src/gdb/objc-exp.y,v
> retrieving revision 1.38
> diff -u -p -u -p -r1.38 objc-exp.y
> --- objc-exp.y	5 Mar 2010 20:18:14 -0000	1.38
> +++ objc-exp.y	17 Aug 2010 00:17:29 -0000
> @@ -1016,8 +1016,9 @@ parse_number (p, len, parsed_float, puti
>  
>        /* It's a float since it contains a point or an exponent.  */
>  
> -      sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
> -	      &putithere->typed_val_float.dval, &c);
> +      if (sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
> +		  &putithere->typed_val_float.dval, &c) != 1)

Shouldn't that be "< 1" since there can be two conversions?

Andreas.

-- 
Andreas Schwab, schwab@redhat.com
GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84  5EC7 45C6 250E 6F00 984E
"And now for something completely different."

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Handle 0 result from sscanf when parsing fp values.
  2010-08-17  8:18 ` Andreas Schwab
@ 2010-08-17 11:37   ` Doug Evans
  2010-08-18 20:38     ` Doug Evans
  0 siblings, 1 reply; 15+ messages in thread
From: Doug Evans @ 2010-08-17 11:37 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: gdb-patches

On Tue, Aug 17, 2010 at 1:18 AM, Andreas Schwab <schwab@redhat.com> wrote:
> dje@google.com (Doug Evans) writes:
>
>> Index: objc-exp.y
>> ===================================================================
>> RCS file: /cvs/src/src/gdb/objc-exp.y,v
>> retrieving revision 1.38
>> diff -u -p -u -p -r1.38 objc-exp.y
>> --- objc-exp.y        5 Mar 2010 20:18:14 -0000       1.38
>> +++ objc-exp.y        17 Aug 2010 00:17:29 -0000
>> @@ -1016,8 +1016,9 @@ parse_number (p, len, parsed_float, puti
>>
>>        /* It's a float since it contains a point or an exponent.  */
>>
>> -      sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
>> -           &putithere->typed_val_float.dval, &c);
>> +      if (sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
>> +               &putithere->typed_val_float.dval, &c) != 1)
>
> Shouldn't that be "< 1" since there can be two conversions?
>
> Andreas.

Both p-exp.y and jv-exp.y check sscanf(...) != 1, the %c is there to
catch garbage after the number.
But it turns out p-exp.y and jv-exp.y are also broken in that they
assume the "f" in "1.1f" is accepted by sscanf as part of the number.
[They don't do what c-exp.y does which is capture the second
conversion as a string and check for valid vs invalid suffixes there.]
Blech.

I can see that if I'm going to test for sscanf(...) != 1 in objc-exp.y
I am going to have to nul-terminate the string first (as the other
*-exp.y files do).
Otherwise "p 1.1+1" will get flagged as an error.  I'll fix that.

As it turns out, in objective-c "1.1f" never makes it that far as the
caller to objc-exp.y:parse_number will flag 1.1f as an error and never
call parse_number.
I was prepared to fix "not checking result of sscanf", but I wasn't
going to fix all of them in this patch, and the closer I look the more
bugs I find.
Guess I'll (try to) fix them too.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Handle 0 result from sscanf when parsing fp values.
  2010-08-17 11:37   ` Doug Evans
@ 2010-08-18 20:38     ` Doug Evans
  2010-08-20  7:34       ` [patch] Fix new FAIL `reject p 0x1.1' [Re: [patch] Handle 0 result from sscanf when parsing fp values.] Jan Kratochvil
  0 siblings, 1 reply; 15+ messages in thread
From: Doug Evans @ 2010-08-18 20:38 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 933 bytes --]

Here's my new patch.
I plan to check this in tomorrow.


2010-08-18  Doug Evans  <dje@google.com>

        PR exp/11926
        * parser-defs.h (parse_float, parse_c_float): Declare.
        * parse.c (parse_float, parse_c_float): New function.
        * c-exp.y (parse_number): Call parse_c_float.
        * objc-exp.y (parse_number): Ditto.
        * p-exp.y (parse_number): Ditto.  Use ANSI/ISO-style definition.
        * jv-exp.y (parse_number): Call parse_float, fix suffix handling.

        testsuite/
        * gdb.base/printcmds.exp (test_float_accepted): New function.
        Move existing float tests there.  Add tests for floats with suffixes.
        (test_float_rejected): New function.
        * gdb.java/jv-print.exp (test_float_accepted): New function.
        (test_float_rejected): New function.
        * gdb.objc/print.exp: New file.
        * gdb.pascal/print.exp: New file.
        * lib/objc.exp: New file.

[-- Attachment #2: gdb-100818-hex-float-crash-2.patch.txt --]
[-- Type: text/plain, Size: 20306 bytes --]

2010-08-18  Doug Evans  <dje@google.com>

	PR exp/11926
	* parser-defs.h (parse_float, parse_c_float): Declare.
	* parse.c (parse_float, parse_c_float): New function.
	* c-exp.y (parse_number): Call parse_c_float.
	* objc-exp.y (parse_number): Ditto.
	* p-exp.y (parse_number): Ditto.  Use ANSI/ISO-style definition.
	* jv-exp.y (parse_number): Call parse_float, fix suffix handling.

	testsuite/
	* gdb.base/printcmds.exp (test_float_accepted): New function.
	Move existing float tests there.  Add tests for floats with suffixes.
	(test_float_rejected): New function.
	* gdb.java/jv-print.exp (test_float_accepted): New function.
	(test_float_rejected): New function.
	* gdb.objc/print.exp: New file.
	* gdb.pascal/print.exp: New file.
	* lib/objc.exp: New file.

Index: c-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/c-exp.y,v
retrieving revision 1.76
diff -u -p -r1.76 c-exp.y
--- c-exp.y	28 Jun 2010 20:18:26 -0000	1.76
+++ c-exp.y	18 Aug 2010 20:16:24 -0000
@@ -1323,10 +1323,8 @@ parse_number (char *p, int len, int pars
 
   if (parsed_float)
     {
-      /* It's a float since it contains a point or an exponent.  */
-      char *s;
-      int num;	/* number of tokens scanned by scanf */
-      char saved_char;
+      const char *suffix;
+      int suffix_len;
 
       /* If it ends at "df", "dd" or "dl", take it as type of decimal floating
          point.  Return DECFLOAT.  */
@@ -1364,35 +1362,10 @@ parse_number (char *p, int len, int pars
 	  return DECFLOAT;
 	}
 
-      s = malloc (len);
-      saved_char = p[len];
-      p[len] = 0;	/* null-terminate the token */
-      num = sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%s",
-		    &putithere->typed_val_float.dval, s);
-      p[len] = saved_char;	/* restore the input stream */
-
-      if (num == 1)
-	putithere->typed_val_float.type = 
-	  parse_type->builtin_double;
-
-      if (num == 2 )
-	{
-	  /* See if it has any float suffix: 'f' for float, 'l' for long 
-	     double.  */
-	  if (!strcasecmp (s, "f"))
-	    putithere->typed_val_float.type = 
-	      parse_type->builtin_float;
-	  else if (!strcasecmp (s, "l"))
-	    putithere->typed_val_float.type = 
-	      parse_type->builtin_long_double;
-	  else
-	    {
-	      free (s);
-	      return ERROR;
-	    }
-	}
-
-      free (s);
+      if (! parse_c_float (parse_gdbarch, p, len,
+			   &putithere->typed_val_float.dval,
+			   &putithere->typed_val_float.type))
+	return ERROR;
       return FLOAT;
     }
 
Index: jv-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/jv-exp.y,v
retrieving revision 1.39
diff -u -p -r1.39 jv-exp.y
--- jv-exp.y	6 May 2010 00:08:44 -0000	1.39
+++ jv-exp.y	18 Aug 2010 20:16:25 -0000
@@ -703,25 +703,28 @@ parse_number (char *p, int len, int pars
 
   if (parsed_float)
     {
-      /* It's a float since it contains a point or an exponent.  */
-      char c;
-      int num = 0;	/* number of tokens scanned by scanf */
-      char saved_char = p[len];
-
-      p[len] = 0;	/* null-terminate the token */
-      num = sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
-		    &putithere->typed_val_float.dval, &c);
-      p[len] = saved_char;	/* restore the input stream */
-      if (num != 1) 		/* check scanf found ONLY a float ... */
+      const char *suffix;
+      int suffix_len;
+
+      if (! parse_float (p, len, &putithere->typed_val_float.dval, &suffix))
 	return ERROR;
-      /* See if it has `f' or `d' suffix (float or double).  */
 
-      c = tolower (p[len - 1]);
+      suffix_len = p + len - suffix;
 
-      if (c == 'f' || c == 'F')
-	putithere->typed_val_float.type = parse_type->builtin_float;
-      else if (isdigit (c) || c == '.' || c == 'd' || c == 'D')
+      if (suffix_len == 0)
 	putithere->typed_val_float.type = parse_type->builtin_double;
+      else if (suffix_len == 1)
+	{
+	  /* See if it has `f' or `d' suffix (float or double).  */
+	  if (tolower (*suffix) == 'f')
+	    putithere->typed_val_float.type =
+	      parse_type->builtin_float;
+	  else if (tolower (*suffix) == 'd')
+	    putithere->typed_val_float.type =
+	      parse_type->builtin_double;
+	  else
+	    return ERROR;
+	}
       else
 	return ERROR;
 
Index: objc-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/objc-exp.y,v
retrieving revision 1.38
diff -u -p -r1.38 objc-exp.y
--- objc-exp.y	5 Mar 2010 20:18:14 -0000	1.38
+++ objc-exp.y	18 Aug 2010 20:16:25 -0000
@@ -1012,26 +1012,10 @@ parse_number (p, len, parsed_float, puti
 
   if (parsed_float)
     {
-      char c;
-
-      /* It's a float since it contains a point or an exponent.  */
-
-      sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
-	      &putithere->typed_val_float.dval, &c);
-
-      /* See if it has `f' or `l' suffix (float or long double).  */
-
-      c = tolower (p[len - 1]);
-
-      if (c == 'f')
-	putithere->typed_val_float.type = parse_type->builtin_float;
-      else if (c == 'l')
-	putithere->typed_val_float.type = parse_type->builtin_long_double;
-      else if (isdigit (c) || c == '.')
-	putithere->typed_val_float.type = parse_type->builtin_double;
-      else
+      if (! parse_c_float (parse_gdbarch, p, len,
+			   &putithere->typed_val_float.dval,
+			   &putithere->typed_val_float.type))
 	return ERROR;
-
       return FLOAT;
     }
 
Index: p-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/p-exp.y,v
retrieving revision 1.50
diff -u -p -r1.50 p-exp.y
--- p-exp.y	8 May 2010 09:18:02 -0000	1.50
+++ p-exp.y	18 Aug 2010 20:16:25 -0000
@@ -791,11 +791,7 @@ name_not_typename :	NAME
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (p, len, parsed_float, putithere)
-     char *p;
-     int len;
-     int parsed_float;
-     YYSTYPE *putithere;
+parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
      here, and we do kind of silly things like cast to unsigned.  */
@@ -820,30 +816,10 @@ parse_number (p, len, parsed_float, puti
 
   if (parsed_float)
     {
-      /* It's a float since it contains a point or an exponent.  */
-      char c;
-      int num = 0;	/* number of tokens scanned by scanf */
-      char saved_char = p[len];
-
-      p[len] = 0;	/* null-terminate the token */
-      num = sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
-		    &putithere->typed_val_float.dval, &c);
-      p[len] = saved_char;	/* restore the input stream */
-      if (num != 1) 		/* check scanf found ONLY a float ... */
+      if (! parse_c_float (parse_gdbarch, p, len,
+			   &putithere->typed_val_float.dval,
+			   &putithere->typed_val_float.type))
 	return ERROR;
-      /* See if it has `f' or `l' suffix (float or long double).  */
-
-      c = tolower (p[len - 1]);
-
-      if (c == 'f')
-	putithere->typed_val_float.type = parse_type->builtin_float;
-      else if (c == 'l')
-	putithere->typed_val_float.type = parse_type->builtin_long_double;
-      else if (isdigit (c) || c == '.')
-	putithere->typed_val_float.type = parse_type->builtin_double;
-      else
-	return ERROR;
-
       return FLOAT;
     }
 
Index: parse.c
===================================================================
RCS file: /cvs/src/src/gdb/parse.c,v
retrieving revision 1.103
diff -u -p -r1.103 parse.c
--- parse.c	18 Aug 2010 19:02:32 -0000	1.103
+++ parse.c	18 Aug 2010 20:16:25 -0000
@@ -1038,8 +1038,6 @@ prefixify_subexp (struct expression *ine
   return result;
 }
 \f
-/* This page contains the two entry points to this file.  */
-
 /* Read an expression from the string *STRINGPTR points to,
    parse it, and return a pointer to a  struct expression  that we malloc.
    Use block BLOCK as the lexical context for variable names;
@@ -1252,6 +1250,73 @@ void
 null_post_parser (struct expression **exp, int void_context_p)
 {
 }
+
+/* Parse floating point value P of length LEN.
+   Return 0 (false) if invalid, 1 (true) if valid.
+   The successfully parsed number is stored in D.
+   *SUFFIX points to the suffix of the number in P.
+
+   NOTE: This accepts the floating point syntax that sscanf accepts.  */
+
+int
+parse_float (const char *p, int len, DOUBLEST *d, const char **suffix)
+{
+  char *copy;
+  char *s;
+  int n, num;
+
+  copy = xmalloc (len + 1);
+  memcpy (copy, p, len);
+  copy[len] = 0;
+
+  num = sscanf (copy, "%" DOUBLEST_SCAN_FORMAT "%n", d, &n);
+  xfree (copy);
+
+  /* The sscanf man page suggests not making any assumptions on the effect
+     of %n on the result, so we don't.
+     That is why we simply test num == 0.  */
+  if (num == 0)
+    return 0;
+
+  *suffix = p + n;
+  return 1;
+}
+
+/* Parse floating point value P of length LEN, using the C syntax for floats.
+   Return 0 (false) if invalid, 1 (true) if valid.
+   The successfully parsed number is stored in *D.
+   Its type is taken from builtin_type (gdbarch) and is stored in *T.  */
+
+int
+parse_c_float (struct gdbarch *gdbarch, const char *p, int len,
+	       DOUBLEST *d, struct type **t)
+{
+  const char *suffix;
+  int suffix_len;
+  const struct builtin_type *builtin_types = builtin_type (gdbarch);
+
+  if (! parse_float (p, len, d, &suffix))
+    return 0;
+
+  suffix_len = p + len - suffix;
+
+  if (suffix_len == 0)
+    *t = builtin_types->builtin_double;
+  else if (suffix_len == 1)
+    {
+      /* Handle suffixes: 'f' for float, 'l' for long double.  */
+      if (tolower (*suffix) == 'f')
+	*t = builtin_types->builtin_float;
+      else if (tolower (*suffix) == 'l')
+	*t = builtin_types->builtin_long_double;
+      else
+	return 0;
+    }
+  else
+    return 0;
+
+  return 1;
+}
 \f
 /* Stuff for maintaining a stack of types.  Currently just used by C, but
    probably useful for any language which declares its types "backwards".  */
Index: parser-defs.h
===================================================================
RCS file: /cvs/src/src/gdb/parser-defs.h,v
retrieving revision 1.36
diff -u -p -r1.36 parser-defs.h
--- parser-defs.h	4 Jun 2010 21:39:47 -0000	1.36
+++ parser-defs.h	18 Aug 2010 20:16:25 -0000
@@ -204,6 +204,12 @@ extern struct type *follow_types (struct
 
 extern void null_post_parser (struct expression **, int);
 
+extern int parse_float (const char *p, int len, DOUBLEST *d,
+			const char **suffix);
+
+extern int parse_c_float (struct gdbarch *gdbarch, const char *p, int len,
+			  DOUBLEST *d, struct type **t);
+
 /* During parsing of a C expression, the pointer to the next character
    is in this variable.  */
 
Index: testsuite/gdb.base/printcmds.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/printcmds.exp,v
retrieving revision 1.36
diff -u -p -r1.36 printcmds.exp
--- testsuite/gdb.base/printcmds.exp	18 Aug 2010 16:37:21 -0000	1.36
+++ testsuite/gdb.base/printcmds.exp	18 Aug 2010 20:16:25 -0000
@@ -102,17 +102,6 @@ proc test_integer_literals_rejected {} {
 
     test_print_reject "p DEADBEEF"
 
-    # Gdb currently fails this test for all configurations.  The C
-    # lexer thinks that 123DEADBEEF is a floating point number, but
-    # then fails to notice that atof() only eats the 123 part.
-    # FIXME:  This should be put into PRMS.
-    # Fixed, 4/25/97, by Bob Manson.
-
-    test_print_reject "p 123DEADBEEF"
-    test_print_reject "p 123foobar.bazfoo3"
-    test_print_reject "p 123EEEEEEEEEEEEEEEEE33333k333"
-    gdb_test "p 123.4+56.7" "180.(099\[0-9]*|100\[0-9\]*)" "check for floating addition"
-
     # Test various octal values.
 
     test_print_reject "p 09" 
@@ -129,6 +118,36 @@ proc test_integer_literals_rejected {} {
     test_print_reject "p 0b12" 
 }
 
+proc test_float_accepted {} {
+    # This test is useful to catch successful parsing of the first fp value.
+    gdb_test "p 123.4+56.7" " = 180.(099\[0-9]*|100\[0-9\]*)" "check for floating addition"
+
+    # Test all the suffixes (including no suffix).
+    gdb_test "p 1." " = 1"
+    gdb_test "p 1.5" " = 1.5"
+    gdb_test "p 1.f" " = 1"
+    gdb_test "p 1.5f" " = 1.5"
+    gdb_test "p 1.l" " = 1"
+    gdb_test "p 1.5l" " = 1.5"
+}
+
+proc test_float_rejected {} {
+    # Gdb use to fail this test for all configurations.  The C
+    # lexer thought that 123DEADBEEF was a floating point number, but
+    # then failed to notice that atof() only eats the 123 part.
+    # Fixed, 4/25/97, by Bob Manson.
+    test_print_reject "p 123DEADBEEF"
+
+    test_print_reject "p 123foobar.bazfoo3"
+    test_print_reject "p 123EEEEEEEEEEEEEEEEE33333k333"
+    test_print_reject "p 0x1.1"
+
+    # Test bad suffixes.
+    test_print_reject "p 1.1x"
+    test_print_reject "p 1.1ff"
+    test_print_reject "p 1.1ll"
+}
+
 proc test_print_all_chars {} {
     global gdb_prompt
 
@@ -781,6 +800,8 @@ if ![runto_main] then {
 
 test_integer_literals_accepted
 test_integer_literals_rejected
+test_float_accepted
+test_float_rejected
 test_character_literals_accepted
 test_print_all_chars
 test_print_repeats_10
Index: testsuite/gdb.java/jv-print.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.java/jv-print.exp,v
retrieving revision 1.14
diff -u -p -r1.14 jv-print.exp
--- testsuite/gdb.java/jv-print.exp	18 Aug 2010 16:37:21 -0000	1.14
+++ testsuite/gdb.java/jv-print.exp	18 Aug 2010 20:16:25 -0000
@@ -97,6 +97,28 @@ proc test_integer_literals_rejected {} {
     test_print_reject "p 0xAG" 
 }
 
+proc test_float_accepted {} {
+    # Test parsing of fp value with legit text following.
+    gdb_test "p 1234.5+1" " = 1235.5" "check fp + text"
+
+    # Test all the suffixes (including no suffix).
+    gdb_test "p 1." " = 1"
+    gdb_test "p 1.5" " = 1.5"
+    gdb_test "p 1.f" " = 1"
+    gdb_test "p 1.5f" " = 1.5"
+    gdb_test "p 1.d" " = 1"
+    gdb_test "p 1.5d" " = 1.5"
+}
+
+proc test_float_rejected {} {
+    # Test invalid fp values.
+    test_print_reject "p 0x1.1"
+
+    # Test bad suffixes.
+    test_print_reject "p 1.1x"
+    test_print_reject "p 1.1ff"
+    test_print_reject "p 1.1dd"
+}
 
 
 # Start with a fresh gdb.
@@ -117,6 +139,8 @@ if [set_lang_java] then {
     test_integer_literals_accepted
     test_character_literals_accepted
     test_integer_literals_rejected
+    test_float_accepted
+    test_float_rejected
 } else {
     warning "Java print command tests suppressed"
 }
Index: testsuite/gdb.objc/print.exp
===================================================================
RCS file: testsuite/gdb.objc/print.exp
diff -N testsuite/gdb.objc/print.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.objc/print.exp	18 Aug 2010 20:16:25 -0000
@@ -0,0 +1,68 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2010 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 <http://www.gnu.org/licenses/>.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@gnu.org
+
+# Test printing of various values.
+# NOTE: The tests here intentionally do not require an objc compiler.
+
+if $tracelevel {
+    strace $tracelevel
+}
+
+load_lib "objective-c.exp"
+
+proc test_float_accepted {} {
+    # Test parsing of fp value with legit text following.
+    gdb_test "p 1234.5+1" " = 1235.5" "check fp + text"
+
+    # Test all the suffixes (including no suffix).
+    gdb_test "p 1." " = 1"
+    gdb_test "p 1.5" " = 1.5"
+    setup_kfail gdb/11925 "*-*-*"
+    gdb_test "p 1.f" " = 1"
+    setup_kfail gdb/11925 "*-*-*"
+    gdb_test "p 1.5f" " = 1.5"
+    setup_kfail gdb/11925 "*-*-*"
+    gdb_test "p 1.l" " = 1"
+    setup_kfail gdb/11925 "*-*-*"
+    gdb_test "p 1.5l" " = 1.5"
+}
+
+proc test_float_rejected {} {
+    # Test invalid fp values.
+    test_print_reject "p 0x1.1"
+
+    # Test bad suffixes.
+    test_print_reject "p 1.1x"
+    test_print_reject "p 1.1ff"
+    test_print_reject "p 1.1ll"
+}
+
+# Start with a fresh gdb.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+
+if [set_lang_objc] {
+    test_float_accepted
+    test_float_rejected
+} else {
+    warning "Objective-c print tests suppressed"
+}
Index: testsuite/gdb.pascal/print.exp
===================================================================
RCS file: testsuite/gdb.pascal/print.exp
diff -N testsuite/gdb.pascal/print.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.pascal/print.exp	18 Aug 2010 20:16:25 -0000
@@ -0,0 +1,64 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2010 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 <http://www.gnu.org/licenses/>.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@gnu.org
+
+# Test printing of various values.
+# NOTE: The tests here intentionally do not require a pascal compiler.
+
+if $tracelevel {
+    strace $tracelevel
+}
+
+load_lib "pascal.exp"
+
+proc test_float_accepted {} {
+    # Test parsing of fp value with legit text following.
+    gdb_test "p 1234.5+1" " = 1235.5" "check fp + text"
+
+    # Test all the suffixes (including no suffix).
+    gdb_test "p 1." " = 1"
+    gdb_test "p 1.5" " = 1.5"
+    gdb_test "p 1.f" " = 1"
+    gdb_test "p 1.5f" " = 1.5"
+    gdb_test "p 1.l" " = 1"
+    gdb_test "p 1.5l" " = 1.5"
+}
+
+proc test_float_rejected {} {
+    # Test invalid fp values.
+    test_print_reject "p 0x1.1"
+
+    # Test bad suffixes.
+    test_print_reject "p 1.1x"
+    test_print_reject "p 1.1ff"
+    test_print_reject "p 1.1ll"
+}
+
+# Start with a fresh gdb.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+
+if [set_lang_pascal] {
+    test_float_accepted
+    test_float_rejected
+} else {
+    warning "Pascal print tests suppressed"
+}
Index: testsuite/lib/objective-c.exp
===================================================================
RCS file: testsuite/lib/objective-c.exp
diff -N testsuite/lib/objective-c.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/lib/objective-c.exp	18 Aug 2010 20:16:25 -0000
@@ -0,0 +1,30 @@
+# This test code is part of GDB, the GNU debugger.
+
+# Copyright 2010 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 <http://www.gnu.org/licenses/>.
+
+# Auxiliary function to set the language to fortran.
+# The result is 1 (true) for success, 0 (false) for failure.
+
+proc set_lang_objc {} {
+    if [gdb_test_no_output "set language objective-c"] {
+	return 0
+    }
+    if [gdb_test "show language" ".* source language is \"objective-c\"." \
+	   "set language to \"objective-c\""] {
+	return 0
+    }
+    return 1;
+}

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [patch] Fix new FAIL `reject p 0x1.1'  [Re: [patch] Handle 0 result from sscanf when parsing fp values.]
  2010-08-18 20:38     ` Doug Evans
@ 2010-08-20  7:34       ` Jan Kratochvil
  2010-08-20  7:37         ` [patch] Fix new FAIL `reject p 0x1.1' [fixup] " Jan Kratochvil
  0 siblings, 1 reply; 15+ messages in thread
From: Jan Kratochvil @ 2010-08-20  7:34 UTC (permalink / raw)
  To: Doug Evans; +Cc: Andreas Schwab, gdb-patches

Hi,

0x1.1 is a perfectly valid hexadecimal floating point.  The new testcase:
PASS CentOS-4.8 glibc-2.3.4-2.43.el4_8.3
FAIL CentOS-5.5 glibc-2.5-49.el5_5.4
FAIL Fedora 13+14

OK to check-in?


Thanks,
Jan


gdb/testsuite/
2010-08-20  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.base/printcmds.exp (p 0x1.1): PASS on parse as 1.0625.

--- a/gdb/testsuite/gdb.base/printcmds.exp
+++ b/gdb/testsuite/gdb.base/printcmds.exp
@@ -140,7 +140,8 @@ proc test_float_rejected {} {
 
     test_print_reject "p 123foobar.bazfoo3"
     test_print_reject "p 123EEEEEEEEEEEEEEEEE33333k333"
-    test_print_reject "p 0x1.1"
+    # Older glibc does not support hex float, newer does.
+    test_print_reject "p 0x1.1" " = 1\\.0625\r\n"
 
     # Test bad suffixes.
     test_print_reject "p 1.1x"

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [patch] Fix new FAIL `reject p 0x1.1' [fixup]  [Re: [patch] Handle 0 result from sscanf when parsing fp values.]
  2010-08-20  7:34       ` [patch] Fix new FAIL `reject p 0x1.1' [Re: [patch] Handle 0 result from sscanf when parsing fp values.] Jan Kratochvil
@ 2010-08-20  7:37         ` Jan Kratochvil
  2010-08-20 11:58           ` Joseph S. Myers
  0 siblings, 1 reply; 15+ messages in thread
From: Jan Kratochvil @ 2010-08-20  7:37 UTC (permalink / raw)
  To: Doug Evans; +Cc: Andreas Schwab, gdb-patches

[fixup]

On Fri, 20 Aug 2010 09:34:30 +0200, Jan Kratochvil wrote:
Hi,

0x1.1 is a perfectly valid hexadecimal floating point.  The new testcase:
PASS CentOS-4.8 glibc-2.3.4-2.43.el4_8.3
FAIL CentOS-5.5 glibc-2.5-49.el5_5.4
FAIL Fedora 13+14

OK to check-in?


Thanks,
Jan


gdb/testsuite/
2010-08-20  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.base/printcmds.exp (p 0x1.1): PASS on parse as 1.0625.
	* gdb.java/jv-print.exp (p 0x1.1): PASS on parse as 1.0625.

--- a/gdb/testsuite/gdb.base/printcmds.exp
+++ b/gdb/testsuite/gdb.base/printcmds.exp
@@ -140,7 +140,8 @@ proc test_float_rejected {} {
 
     test_print_reject "p 123foobar.bazfoo3"
     test_print_reject "p 123EEEEEEEEEEEEEEEEE33333k333"
-    test_print_reject "p 0x1.1"
+    # Older glibc does not support hex float, newer does.
+    test_print_reject "p 0x1.1" " = 1\\.0625\r\n"
 
     # Test bad suffixes.
     test_print_reject "p 1.1x"
--- a/gdb/testsuite/gdb.java/jv-print.exp
+++ b/gdb/testsuite/gdb.java/jv-print.exp
@@ -112,7 +112,8 @@ proc test_float_accepted {} {
 
 proc test_float_rejected {} {
     # Test invalid fp values.
-    test_print_reject "p 0x1.1"
+    # Older glibc does not support hex float, newer does.
+    test_print_reject "p 0x1.1" " = 1\\.0625\r\n"
 
     # Test bad suffixes.
     test_print_reject "p 1.1x"

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup]  [Re: [patch] Handle 0 result from sscanf when parsing fp values.]
  2010-08-20  7:37         ` [patch] Fix new FAIL `reject p 0x1.1' [fixup] " Jan Kratochvil
@ 2010-08-20 11:58           ` Joseph S. Myers
  2010-08-23 15:35             ` Doug Evans
  0 siblings, 1 reply; 15+ messages in thread
From: Joseph S. Myers @ 2010-08-20 11:58 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: Doug Evans, Andreas Schwab, gdb-patches

On Fri, 20 Aug 2010, Jan Kratochvil wrote:

> [fixup]
> 
> On Fri, 20 Aug 2010 09:34:30 +0200, Jan Kratochvil wrote:
> Hi,
> 
> 0x1.1 is a perfectly valid hexadecimal floating point.  The new testcase:

It's not valid in C source code (a binary exponent is required), though it 
is valid as input to strtod (like INF, NAN, NAN(n-char-sequence_opt) etc.) 
- is the intention here that GDB deliberately accepts something beyond 
what would be valid in C source code?

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup] [Re: [patch] Handle 0 result from sscanf when parsing fp values.]
  2010-08-20 11:58           ` Joseph S. Myers
@ 2010-08-23 15:35             ` Doug Evans
  2010-08-23 18:55               ` [patch] Fix new FAIL `reject p 0x1.1' [fixup] Jan Kratochvil
  0 siblings, 1 reply; 15+ messages in thread
From: Doug Evans @ 2010-08-23 15:35 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: Jan Kratochvil, Andreas Schwab, gdb-patches

On Fri, Aug 20, 2010 at 4:58 AM, Joseph S. Myers
<joseph@codesourcery.com> wrote:
> On Fri, 20 Aug 2010, Jan Kratochvil wrote:
>
>> [fixup]
>>
>> On Fri, 20 Aug 2010 09:34:30 +0200, Jan Kratochvil wrote:
>> Hi,
>>
>> 0x1.1 is a perfectly valid hexadecimal floating point.  The new testcase:
>
> It's not valid in C source code (a binary exponent is required), though it
> is valid as input to strtod (like INF, NAN, NAN(n-char-sequence_opt) etc.)
> - is the intention here that GDB deliberately accepts something beyond
> what would be valid in C source code?

I don't know what gdb is intended to accept.

My main concern here is that there is a testcase that exercises the
code in question.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup]
  2010-08-23 15:35             ` Doug Evans
@ 2010-08-23 18:55               ` Jan Kratochvil
  2010-08-23 19:49                 ` Doug Evans
  0 siblings, 1 reply; 15+ messages in thread
From: Jan Kratochvil @ 2010-08-23 18:55 UTC (permalink / raw)
  To: Doug Evans; +Cc: Joseph S. Myers, Andreas Schwab, gdb-patches

On Mon, 23 Aug 2010 17:35:07 +0200, Doug Evans wrote:
> On Fri, Aug 20, 2010 at 4:58 AM, Joseph S. Myers <joseph@codesourcery.com> wrote:
> > On Fri, 20 Aug 2010, Jan Kratochvil wrote:
> >> On Fri, 20 Aug 2010 09:34:30 +0200, Jan Kratochvil wrote:
> >> 0x1.1 is a perfectly valid hexadecimal floating point.  The new testcase:
> >
> > It's not valid in C source code (a binary exponent is required), though it
> > is valid as input to strtod (like INF, NAN, NAN(n-char-sequence_opt) etc.)
> > - is the intention here that GDB deliberately accepts something beyond
> > what would be valid in C source code?
> 
> I don't know what gdb is intended to accept.

So far I believe GDB is intended to be more relaxed than the C compiler.
(PR symtab/11846 -> is accepted interchangeable with .)
(static symbols get resolved from not-current CUs)
etc.

While thanks for catching it I still believe now my testcase update is the
appropriate fix - if glibc supports then extended input syntax let the GDB
user benefit from it.


Thanks,
Jan

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup]
  2010-08-23 18:55               ` [patch] Fix new FAIL `reject p 0x1.1' [fixup] Jan Kratochvil
@ 2010-08-23 19:49                 ` Doug Evans
  2010-08-23 19:57                   ` Doug Evans
  0 siblings, 1 reply; 15+ messages in thread
From: Doug Evans @ 2010-08-23 19:49 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: Joseph S. Myers, Andreas Schwab, gdb-patches

On Mon, Aug 23, 2010 at 11:54 AM, Jan Kratochvil
<jan.kratochvil@redhat.com> wrote:
> On Mon, 23 Aug 2010 17:35:07 +0200, Doug Evans wrote:
>> On Fri, Aug 20, 2010 at 4:58 AM, Joseph S. Myers <joseph@codesourcery.com> wrote:
>> > On Fri, 20 Aug 2010, Jan Kratochvil wrote:
>> >> On Fri, 20 Aug 2010 09:34:30 +0200, Jan Kratochvil wrote:
>> >> 0x1.1 is a perfectly valid hexadecimal floating point.  The new testcase:
>> >
>> > It's not valid in C source code (a binary exponent is required), though it
>> > is valid as input to strtod (like INF, NAN, NAN(n-char-sequence_opt) etc.)
>> > - is the intention here that GDB deliberately accepts something beyond
>> > what would be valid in C source code?
>>
>> I don't know what gdb is intended to accept.
>
> So far I believe GDB is intended to be more relaxed than the C compiler.

In general sure, but general rules need to be re-evaluated for each
context in which they're applied.
In this context ... I'm not sure, but I don't have a strong opinion either. :-)

> (PR symtab/11846 -> is accepted interchangeable with .)
> (static symbols get resolved from not-current CUs)
> etc.
>
> While thanks for catching it I still believe now my testcase update is the
> appropriate fix - if glibc supports then extended input syntax let the GDB
> user benefit from it.

It's ok with me.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup]
  2010-08-23 19:49                 ` Doug Evans
@ 2010-08-23 19:57                   ` Doug Evans
  2010-08-31 19:38                     ` Jan Kratochvil
  0 siblings, 1 reply; 15+ messages in thread
From: Doug Evans @ 2010-08-23 19:57 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: Joseph S. Myers, Andreas Schwab, gdb-patches

On Mon, Aug 23, 2010 at 12:49 PM, Doug Evans <dje@google.com> wrote:
>> While thanks for catching it I still believe now my testcase update is the
>> appropriate fix - if glibc supports then extended input syntax let the GDB
>> user benefit from it.
>
> It's ok with me.

I should add that IWBN to have an additional testcase that exercises
sscanf (...) == 0 on newer glibcs.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup]
  2010-08-23 19:57                   ` Doug Evans
@ 2010-08-31 19:38                     ` Jan Kratochvil
  2010-08-31 22:51                       ` Doug Evans
  0 siblings, 1 reply; 15+ messages in thread
From: Jan Kratochvil @ 2010-08-31 19:38 UTC (permalink / raw)
  To: Doug Evans; +Cc: Joseph S. Myers, Andreas Schwab, gdb-patches

On Mon, 23 Aug 2010 21:57:19 +0200, Doug Evans wrote:
> On Mon, Aug 23, 2010 at 12:49 PM, Doug Evans <dje@google.com> wrote:
> >> While thanks for catching it I still believe now my testcase update is the
> >> appropriate fix - if glibc supports then extended input syntax let the GDB
> >> user benefit from it.
> >
> > It's ok with me.
> 
> I should add that IWBN to have an additional testcase that exercises
> sscanf (...) == 0 on newer glibcs.

OK, I forgot first.  OK to check-in?  Tested both cases (RHEL-4.8 and
Fedora14snapshot).


Thanks,
Jan


gdb/testsuite/
2010-08-31  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.base/printcmds.exp (test_float_accepted): Import gdb_prompt.
	Move here, negate and extend by XFAIL the "p 0x1.1" test from ...
	(test_float_rejected): ... here.
	* gdb.java/jv-print.exp (test_float_accepted): Import gdb_prompt.
	Move here, negate and extend by XFAIL the "p 0x1.1" test from ...
	(test_float_rejected): ... here.

--- a/gdb/testsuite/gdb.base/printcmds.exp
+++ b/gdb/testsuite/gdb.base/printcmds.exp
@@ -119,6 +119,8 @@ proc test_integer_literals_rejected {} {
 }
 
 proc test_float_accepted {} {
+    global gdb_prompt
+
     # This test is useful to catch successful parsing of the first fp value.
     gdb_test "p 123.4+56.7" " = 180.(099\[0-9]*|100\[0-9\]*)" "check for floating addition"
 
@@ -129,6 +131,18 @@ proc test_float_accepted {} {
     gdb_test "p 1.5f" " = 1.5"
     gdb_test "p 1.l" " = 1"
     gdb_test "p 1.5l" " = 1.5"
+
+    # Test hexadecimal floating point.
+    set test "p 0x1.1"
+    gdb_test_multiple $test $test {
+	-re " = 1\\.0625\r\n$gdb_prompt $" {
+	    pass $test
+	}
+	-re "Invalid number \"0x1\\.1\"\\.\r\n$gdb_prompt $" {
+	    # Older glibc does not support hex float, newer does.
+	    xfail $test
+	}
+    }
 }
 
 proc test_float_rejected {} {
@@ -140,7 +154,6 @@ proc test_float_rejected {} {
 
     test_print_reject "p 123foobar.bazfoo3"
     test_print_reject "p 123EEEEEEEEEEEEEEEEE33333k333"
-    test_print_reject "p 0x1.1"
 
     # Test bad suffixes.
     test_print_reject "p 1.1x"
--- a/gdb/testsuite/gdb.java/jv-print.exp
+++ b/gdb/testsuite/gdb.java/jv-print.exp
@@ -98,6 +98,8 @@ proc test_integer_literals_rejected {} {
 }
 
 proc test_float_accepted {} {
+    global gdb_prompt
+
     # Test parsing of fp value with legit text following.
     gdb_test "p 1234.5+1" " = 1235.5" "check fp + text"
 
@@ -108,12 +110,21 @@ proc test_float_accepted {} {
     gdb_test "p 1.5f" " = 1.5"
     gdb_test "p 1.d" " = 1"
     gdb_test "p 1.5d" " = 1.5"
+
+    # Test hexadecimal floating point.
+    set test "p 0x1.1"
+    gdb_test_multiple $test $test {
+	-re " = 1\\.0625\r\n$gdb_prompt $" {
+	    pass $test
+	}
+	-re "Invalid number \"0x1\\.1\"\r\n$gdb_prompt $" {
+	    # Older glibc does not support hex float, newer does.
+	    xfail $test
+	}
+    }
 }
 
 proc test_float_rejected {} {
-    # Test invalid fp values.
-    test_print_reject "p 0x1.1"
-
     # Test bad suffixes.
     test_print_reject "p 1.1x"
     test_print_reject "p 1.1ff"

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup]
  2010-08-31 19:38                     ` Jan Kratochvil
@ 2010-08-31 22:51                       ` Doug Evans
  2010-09-02 15:11                         ` Jan Kratochvil
  0 siblings, 1 reply; 15+ messages in thread
From: Doug Evans @ 2010-08-31 22:51 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: gdb-patches

On Tue, Aug 31, 2010 at 12:37 PM, Jan Kratochvil
<jan.kratochvil@redhat.com> wrote:
>
> On Mon, 23 Aug 2010 21:57:19 +0200, Doug Evans wrote:
> > On Mon, Aug 23, 2010 at 12:49 PM, Doug Evans <dje@google.com> wrote:
> > >> While thanks for catching it I still believe now my testcase update is the
> > >> appropriate fix - if glibc supports then extended input syntax let the GDB
> > >> user benefit from it.
> > >
> > > It's ok with me.
> >
> > I should add that IWBN to have an additional testcase that exercises
> > sscanf (...) == 0 on newer glibcs.
>
> OK, I forgot first.  OK to check-in?  Tested both cases (RHEL-4.8 and
> Fedora14snapshot).
>
>
> Thanks,
> Jan
>
>
> gdb/testsuite/
> 2010-08-31  Jan Kratochvil  <jan.kratochvil@redhat.com>
>
>        * gdb.base/printcmds.exp (test_float_accepted): Import gdb_prompt.
>        Move here, negate and extend by XFAIL the "p 0x1.1" test from ...
>        (test_float_rejected): ... here.
>        * gdb.java/jv-print.exp (test_float_accepted): Import gdb_prompt.
>        Move here, negate and extend by XFAIL the "p 0x1.1" test from ...
>        (test_float_rejected): ... here.

Apologies for the resend.  Somehow it went out as text/html (which the
list rejects).

This is ok with me, but I think you also want to similarly patch
gdb.{objc,pascal}/print.exp, right?

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup]
  2010-08-31 22:51                       ` Doug Evans
@ 2010-09-02 15:11                         ` Jan Kratochvil
  2010-09-06 22:29                           ` Jan Kratochvil
  0 siblings, 1 reply; 15+ messages in thread
From: Jan Kratochvil @ 2010-09-02 15:11 UTC (permalink / raw)
  To: Doug Evans; +Cc: gdb-patches

On Wed, 01 Sep 2010 00:51:25 +0200, Doug Evans wrote:
> This is ok with me, but I think you also want to similarly patch
> gdb.{objc,pascal}/print.exp, right?

Yes.

Tested on fedora14snapshot.x86_64 (PASS) and epel-4.x86_64 (XFAIL).

I will check it in later if not replied.


Thanks,
Jan


gdb/testsuite/
2010-09-02  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.base/printcmds.exp (test_float_accepted): Import gdb_prompt.
	Move here, negate and extend by XFAIL the "p 0x1.1" test from ...
	(test_float_rejected): ... here.
	* gdb.java/jv-print.exp (test_float_accepted): Import gdb_prompt.
	Move here, negate and extend by XFAIL the "p 0x1.1" test from ...
	(test_float_rejected): ... here.
	* gdb.objc/print.exp (test_float_accepted): Import gdb_prompt.
	Move here, negate and extend by XFAIL the "p 0x1.1" test from ...
	(test_float_rejected): ... here.
	* gdb.pascal/print.exp (test_float_accepted): Import gdb_prompt.
	Move here, negate and extend by XFAIL the "p 0x1.1" test from ...
	(test_float_rejected): ... here.

--- a/gdb/testsuite/gdb.base/printcmds.exp
+++ b/gdb/testsuite/gdb.base/printcmds.exp
@@ -119,6 +119,8 @@ proc test_integer_literals_rejected {} {
 }
 
 proc test_float_accepted {} {
+    global gdb_prompt
+
     # This test is useful to catch successful parsing of the first fp value.
     gdb_test "p 123.4+56.7" " = 180.(099\[0-9]*|100\[0-9\]*)" "check for floating addition"
 
@@ -129,6 +131,18 @@ proc test_float_accepted {} {
     gdb_test "p 1.5f" " = 1.5"
     gdb_test "p 1.l" " = 1"
     gdb_test "p 1.5l" " = 1.5"
+
+    # Test hexadecimal floating point.
+    set test "p 0x1.1"
+    gdb_test_multiple $test $test {
+	-re " = 1\\.0625\r\n$gdb_prompt $" {
+	    pass $test
+	}
+	-re "Invalid number \"0x1\\.1\"\\.\r\n$gdb_prompt $" {
+	    # Older glibc does not support hex float, newer does.
+	    xfail $test
+	}
+    }
 }
 
 proc test_float_rejected {} {
@@ -140,7 +154,6 @@ proc test_float_rejected {} {
 
     test_print_reject "p 123foobar.bazfoo3"
     test_print_reject "p 123EEEEEEEEEEEEEEEEE33333k333"
-    test_print_reject "p 0x1.1"
 
     # Test bad suffixes.
     test_print_reject "p 1.1x"
--- a/gdb/testsuite/gdb.java/jv-print.exp
+++ b/gdb/testsuite/gdb.java/jv-print.exp
@@ -98,6 +98,8 @@ proc test_integer_literals_rejected {} {
 }
 
 proc test_float_accepted {} {
+    global gdb_prompt
+
     # Test parsing of fp value with legit text following.
     gdb_test "p 1234.5+1" " = 1235.5" "check fp + text"
 
@@ -108,12 +110,21 @@ proc test_float_accepted {} {
     gdb_test "p 1.5f" " = 1.5"
     gdb_test "p 1.d" " = 1"
     gdb_test "p 1.5d" " = 1.5"
+
+    # Test hexadecimal floating point.
+    set test "p 0x1.1"
+    gdb_test_multiple $test $test {
+	-re " = 1\\.0625\r\n$gdb_prompt $" {
+	    pass $test
+	}
+	-re "Invalid number \"0x1\\.1\"\r\n$gdb_prompt $" {
+	    # Older glibc does not support hex float, newer does.
+	    xfail $test
+	}
+    }
 }
 
 proc test_float_rejected {} {
-    # Test invalid fp values.
-    test_print_reject "p 0x1.1"
-
     # Test bad suffixes.
     test_print_reject "p 1.1x"
     test_print_reject "p 1.1ff"
--- a/gdb/testsuite/gdb.objc/print.exp
+++ b/gdb/testsuite/gdb.objc/print.exp
@@ -28,6 +28,8 @@ if $tracelevel {
 load_lib "objc.exp"
 
 proc test_float_accepted {} {
+    global gdb_prompt
+
     # Test parsing of fp value with legit text following.
     gdb_test "p 1234.5+1" " = 1235.5" "check fp + text"
 
@@ -42,12 +44,21 @@ proc test_float_accepted {} {
     gdb_test "p 1.l" " = 1"
     setup_kfail gdb/11925 "*-*-*"
     gdb_test "p 1.5l" " = 1.5"
+
+    # Test hexadecimal floating point.
+    set test "p 0x1.1"
+    gdb_test_multiple $test $test {
+	-re " = 1\\.0625\r\n$gdb_prompt $" {
+	    pass $test
+	}
+	-re "Invalid number \"0x1\\.1\"\\.\r\n$gdb_prompt $" {
+	    # Older glibc does not support hex float, newer does.
+	    xfail $test
+	}
+    }
 }
 
 proc test_float_rejected {} {
-    # Test invalid fp values.
-    test_print_reject "p 0x1.1"
-
     # Test bad suffixes.
     test_print_reject "p 1.1x"
     test_print_reject "p 1.1ff"
--- a/gdb/testsuite/gdb.pascal/print.exp
+++ b/gdb/testsuite/gdb.pascal/print.exp
@@ -28,6 +28,8 @@ if $tracelevel {
 load_lib "pascal.exp"
 
 proc test_float_accepted {} {
+    global gdb_prompt
+
     # Test parsing of fp value with legit text following.
     gdb_test "p 1234.5+1" " = 1235.5" "check fp + text"
 
@@ -38,12 +40,21 @@ proc test_float_accepted {} {
     gdb_test "p 1.5f" " = 1.5"
     gdb_test "p 1.l" " = 1"
     gdb_test "p 1.5l" " = 1.5"
+
+    # Test hexadecimal floating point.
+    set test "p 0x1.1"
+    gdb_test_multiple $test $test {
+	-re " = 1\\.0625\r\n$gdb_prompt $" {
+	    pass $test
+	}
+	-re "Invalid number \"0x1\\.1\"\\.\r\n$gdb_prompt $" {
+	    # Older glibc does not support hex float, newer does.
+	    xfail $test
+	}
+    }
 }
 
 proc test_float_rejected {} {
-    # Test invalid fp values.
-    test_print_reject "p 0x1.1"
-
     # Test bad suffixes.
     test_print_reject "p 1.1x"
     test_print_reject "p 1.1ff"

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [patch] Fix new FAIL `reject p 0x1.1' [fixup]
  2010-09-02 15:11                         ` Jan Kratochvil
@ 2010-09-06 22:29                           ` Jan Kratochvil
  0 siblings, 0 replies; 15+ messages in thread
From: Jan Kratochvil @ 2010-09-06 22:29 UTC (permalink / raw)
  To: Doug Evans; +Cc: gdb-patches

On Thu, 02 Sep 2010 16:20:48 +0200, Jan Kratochvil wrote:
> I will check it in later if not replied.

Checked-in:
	http://sourceware.org/ml/gdb-cvs/2010-09/msg00048.html


Thanks,
Jan

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2010-09-06 15:49 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-17  0:31 [patch] Handle 0 result from sscanf when parsing fp values Doug Evans
2010-08-17  8:18 ` Andreas Schwab
2010-08-17 11:37   ` Doug Evans
2010-08-18 20:38     ` Doug Evans
2010-08-20  7:34       ` [patch] Fix new FAIL `reject p 0x1.1' [Re: [patch] Handle 0 result from sscanf when parsing fp values.] Jan Kratochvil
2010-08-20  7:37         ` [patch] Fix new FAIL `reject p 0x1.1' [fixup] " Jan Kratochvil
2010-08-20 11:58           ` Joseph S. Myers
2010-08-23 15:35             ` Doug Evans
2010-08-23 18:55               ` [patch] Fix new FAIL `reject p 0x1.1' [fixup] Jan Kratochvil
2010-08-23 19:49                 ` Doug Evans
2010-08-23 19:57                   ` Doug Evans
2010-08-31 19:38                     ` Jan Kratochvil
2010-08-31 22:51                       ` Doug Evans
2010-09-02 15:11                         ` Jan Kratochvil
2010-09-06 22:29                           ` Jan Kratochvil

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).