On 7/22/11 12:32 PM, Ralph Corderoy wrote:
> Hi Jim,
> 
>>> On 07/20/2011 07:34 AM, Ralph Corderoy wrote:
>>>> BTW, the code for the built-in printf has a bug.  For negative
>>>> field-widths it negates a negative integer without checking it
>>>> will fit.  E.g. on this 64-bit machine
>>>>
>>>>      $ printf '%-9223372036854775808s.\n' foo
>>>>      foo.
>>>>      $

Bash doesn't turn this into a negative integer.  It skips over it and
passes the entire business to printf(3), as Eric surmised.

> Just to ensure there's no confusion, as far as bash's built-in printf is
> concerned one aspect of it is about a negative field width since
> 
>     $ printf '.%*q.\n' -10 foo
>     .foo       .
> 
> is implemented by converting the "-10" into a number, spotting it's
> negative, setting the left-justified flag, and then negating the number.

As printf(3) and ISO C specify, by the way (Posix is silent on the `*'
field width specifier).  Bash simply clamps the result at INT_MIN, which
turns into a left-justified INT_MAX, and goes on.  The question is whether
it should turn an out-of-range field width into 0, an error, or
INT_{MIN,MAX}.  Jim Meyering is correct when he says it's unspecified.
Different implementations have gone different ways.

Chet
-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU    c...@case.edu    http://cnswww.cns.cwru.edu/~chet/

Reply via email to