Correctly handle %p in wprintf
Commit Message
[BZ #16890]
* stdio-common/vfprintf.c (process_arg) [%p]: Mark string as wide
when compiling wprintf.
* stdio-common/tstdiomisc.c (t3): New function.
(main): Call it.
---
stdio-common/tstdiomisc.c | 19 +++++++++++++++++++
stdio-common/vfprintf.c | 3 ++-
2 files changed, 21 insertions(+), 1 deletion(-)
Comments
Looks ok however
On Thu, May 01, 2014 at 04:08:10PM +0200, Andreas Schwab wrote:
> diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
> index f7e5f61..c4ff833 100644
> --- a/stdio-common/vfprintf.c
> +++ b/stdio-common/vfprintf.c
> @@ -936,7 +936,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
> /* Make sure the full string "(nil)" is printed. */ \
> if (prec < 5) \
> prec = 5; \
> - is_long = 0; /* This is no wide-char string. */ \
> + /* This is a wide string iff compiling wprintf. */ \
> + is_long = sizeof (CHAR_T) > 1; \
> goto LABEL (print_string); \
> } \
Should we do same thing here or not?
LABEL (form_strerror): \
/* Print description of error ERRNO. */ \
string = \
(CHAR_T *) __strerror_r (save_errno, (char *) work_buffer, \
sizeof work_buffer); \
is_long = 0; /* This is no wide-char string. */ \
goto LABEL (print_string)
Ondřej Bílka <neleai@seznam.cz> writes:
> Should we do same thing here or not?
No, there is no bug here.
Andreas.
On 01-05-2014 11:08, Andreas Schwab wrote:
> [BZ #16890]
> * stdio-common/vfprintf.c (process_arg) [%p]: Mark string as wide
> when compiling wprintf.
> * stdio-common/tstdiomisc.c (t3): New function.
> (main): Call it.
> ---
> stdio-common/tstdiomisc.c | 19 +++++++++++++++++++
> stdio-common/vfprintf.c | 3 ++-
> 2 files changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c
> index 5a25ecc..2e0663a 100644
> --- a/stdio-common/tstdiomisc.c
> +++ b/stdio-common/tstdiomisc.c
> @@ -46,6 +46,24 @@ t2 (void)
> return result;
> }
>
> +static int
> +t3 (void)
> +{
> + char buf[80];
> + wchar_t wbuf[80];
> + int result = 0;
> + int retval;
> +
> + retval = sprintf (buf, "%p", (char *) NULL);
> + result |= retval != 5 || strcmp (buf, "(nil)") != 0;
> +
> + retval = swprintf (wbuf, sizeof (wbuf) / sizeof (wbuf[0]),
> + L"%p", (char *) NULL);
> + result |= retval != 5 || wcscmp (wbuf, L"(nil)") != 0;
> +
> + return result;
> +}
> +
> volatile double qnanval;
> volatile long double lqnanval;
> /* A sNaN is only guaranteed to be representable in variables with static (or
> @@ -243,6 +261,7 @@ main (int argc, char *argv[])
>
> result |= t1 ();
> result |= t2 ();
> + result |= t3 ();
> result |= F ();
>
> result |= fflush (stdout) == EOF;
> diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
> index f7e5f61..c4ff833 100644
> --- a/stdio-common/vfprintf.c
> +++ b/stdio-common/vfprintf.c
> @@ -936,7 +936,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
> /* Make sure the full string "(nil)" is printed. */ \
> if (prec < 5) \
> prec = 5; \
> - is_long = 0; /* This is no wide-char string. */ \
> + /* This is a wide string iff compiling wprintf. */ \
> + is_long = sizeof (CHAR_T) > 1; \
> goto LABEL (print_string); \
> } \
> } \
s/iff/if , besides that LGTM.
> s/iff/if , besides that LGTM.
"iff" is standard shorthand for "if and only if" and seems appropriate
enough in this case.
On 01-05-2014 15:04, Roland McGrath wrote:
>> s/iff/if , besides that LGTM.
> "iff" is standard shorthand for "if and only if" and seems appropriate
> enough in this case.
>
Fair enough then.
@@ -46,6 +46,24 @@ t2 (void)
return result;
}
+static int
+t3 (void)
+{
+ char buf[80];
+ wchar_t wbuf[80];
+ int result = 0;
+ int retval;
+
+ retval = sprintf (buf, "%p", (char *) NULL);
+ result |= retval != 5 || strcmp (buf, "(nil)") != 0;
+
+ retval = swprintf (wbuf, sizeof (wbuf) / sizeof (wbuf[0]),
+ L"%p", (char *) NULL);
+ result |= retval != 5 || wcscmp (wbuf, L"(nil)") != 0;
+
+ return result;
+}
+
volatile double qnanval;
volatile long double lqnanval;
/* A sNaN is only guaranteed to be representable in variables with static (or
@@ -243,6 +261,7 @@ main (int argc, char *argv[])
result |= t1 ();
result |= t2 ();
+ result |= t3 ();
result |= F ();
result |= fflush (stdout) == EOF;
@@ -936,7 +936,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
/* Make sure the full string "(nil)" is printed. */ \
if (prec < 5) \
prec = 5; \
- is_long = 0; /* This is no wide-char string. */ \
+ /* This is a wide string iff compiling wprintf. */ \
+ is_long = sizeof (CHAR_T) > 1; \
goto LABEL (print_string); \
} \
} \