[PATCH] Add "%d" support to _dl_debug_vdprintf

H.J. Lu hjl.tools@gmail.com
Tue Jun 9 14:46:21 GMT 2020


On Tue, Jun 9, 2020 at 7:39 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 09/06/2020 11:18, Adhemerval Zanella wrote:
> >
> >
> > On 05/06/2020 12:03, H.J. Lu via Libc-alpha wrote:
> >> "%d" will be used to print out signed value.
> >
> > LGTM with some smalls nits below.
> >
> >> ---
> >>  elf/dl-misc.c | 31 +++++++++++++++++++++++++++++--
> >>  1 file changed, 29 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/elf/dl-misc.c b/elf/dl-misc.c
> >> index ab70481fda..c82c8ae6fa 100644
> >> --- a/elf/dl-misc.c
> >> +++ b/elf/dl-misc.c
> >> @@ -167,6 +167,7 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
> >>        switch (*fmt)
> >>          {
> >>            /* Integer formatting.  */
> >> +        case 'd':
> >>          case 'u':
> >>          case 'x':
> >>            {
> >
> > Ok.
> >
> >> @@ -179,11 +180,34 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
> >>  #else
> >>              unsigned long int num = va_arg (arg, unsigned int);
> >>  #endif
> >> +            bool negative = false;
> >> +            if (*fmt == 'd')
> >> +              {
> >> +#if LONG_MAX != INT_MAX
> >> +                if (long_mod)
> >> +                  {
> >> +                    if ((long) num < 0)
> >
> > Full type specify on cast.
> >
> >> +                      negative = true;
> >> +                  }
> >> +                else
> >> +                  {
> >> +                    if ((int) num < 0)> +                     {
> >> +                        num = (unsigned int) num;
> >> +                        negative = true;
> >> +                      }
> >> +                  }
> >> +#else
> >> +                if ((int) num < 0)
> >> +                  negative = true;
> >> +#endif
> >> +              }
> >> +
> >>              /* We use alloca() to allocate the buffer with the most
> >>                 pessimistic guess for the size.  Using alloca() allows
> >>                 having more than one integer formatting in a call.  */
> >> -            char *buf = (char *) alloca (3 * sizeof (unsigned long int));
> >> -            char *endp = &buf[3 * sizeof (unsigned long int)];
> >> +            char *buf = (char *) alloca (1 + 3 * sizeof (unsigned long int));
> >> +            char *endp = &buf[1 + 3 * sizeof (unsigned long int)];
> >
> > I think we can remove alloca here and use INT_STRLEN_BOUND (since the
> > string is not '\0' bounded due the writev usage).  Something like:
>
> Sigh, you can't actually remove the alloca here.

Why not?  It seems to work:

gdb) p endp
$3 = 0x7fffffffd674 "\377\177"
(gdb) p buf
$4 = "X\345\377\367\377\177\000\000\371-2147483647"
(gdb) p &buf
$5 = (char (*)[20]) 0x7fffffffd660
(gdb) p 0x7fffffffd674 - 0x7fffffffd660
$6 = 20
(gdb) list
204 #endif
205   }
206
207 char buf[INT_STRLEN_BOUND (long int)];
208 char *endp = &buf[INT_STRLEN_BOUND (long int)];
209 char *cp = _itoa (num, endp, *fmt == 'x' ? 16 : 10, 0);
210
211 /* Pad to the width the user specified.  */
212 if (width != -1)
213   while (endp - cp < width)
(gdb)

> >
> >   char buf[INT_STRLEN_BOUND (unsigned long int)];
> >   char *endp = &buf[INT_STRLEN_BOUND (unsigned long int)];
> >
> >>              char *cp = _itoa (num, endp, *fmt == 'x' ? 16 : 10, 0);
> >>
> >>              /* Pad to the width the user specified.  */
> >> @@ -191,6 +215,9 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
> >>                while (endp - cp < width)
> >>                  *--cp = fill;
> >>
> >> +            if (negative)
> >> +              *--cp = '-';
> >> +
> >>              iov[niov].iov_base = cp;
> >>              iov[niov].iov_len = endp - cp;
> >>              ++niov;
> >>
> >
> > Ok.
> >



-- 
H.J.


More information about the Libc-alpha mailing list