[PATCH] Add "%d" support to _dl_debug_vdprintf

Adhemerval Zanella adhemerval.zanella@linaro.org
Tue Jun 9 14:39:41 GMT 2020



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. 

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


More information about the Libc-alpha mailing list