Sorry I couldn't use bugbash - I don't work with source.

I've attached a complete description of the bug.

Regards,

Rob Robason
Driving Breakthrough Performance in Software Product Quality and
Development Practices

           Phone: 
925-825-1512
            Home: 
Concord, CA 94518
          Mobile: 
925-348-1512
         Website: 
http://rob.robason.net
           Email: 
r...@robason.net

View Rob Robason's
profile on
LinkedIn

printf: '*' broken in conversion spec field width and precision (e.g., "%.*s")

GNU bash, version 4.0.23(1)-release (i386-redhat-linux-gnu) on Fedora 11
(additional configuration info appears at the bottom of the page)


The printf builtin is broken in many variations of use of '*' (e.g., "%.*s") 
in a printf conversion spec to set field width and precision from argument 
values.

The following (bash builtin) command returns an empty line. E.g.:
  $ printf "%.*s\n" 5 "Sample string"

  $

Compare to correct behavior of printf(1) (/usr/bin/printf) with same args
  $ /usr/bin/printf "%.*s\n" 5 "Sample string"
  Sampl
  $

The builtin works only with either "*.*" or "m.m", (where m is an int), but 
not with any of the following legal usages: ".*", "*.", "m.*", "*.m", which 
are all legal variations. I haven't checked the positional "*m$" variants. 
Although I encountered this working with strings, the same problem exists for 
specifiers other than 's'. See "Other examples", below.

The builtin should work as defined for printf(1) and printf(3) (plus of course 
its own added features defined in bash(1)). 

Defined Behavior (man pages, printf(3) gives the most complete picture):
bash(1):
  [in section SHELL BUILTIN COMMANDS, printf]
    "printf [-v var] format [arguments]"
    "The format is a character string which contains ... format specifications, 
      each of which causes printing of the next successive argument. In 
      addition to the standard printf(1) formats, ..." 
    [no relevant format specifier detail provided]
printf(1): 
  "Interpreted sequences are: ...
  "and all C format specifications ending with one of diouxXfeEgGcs, ... 
  "Variable widths are handled."
  
printf(3):
  [in section "Format of the format string""]
    "Each conversion specification is introduced by the character %, and 
      ends with a conversion specifier. In between there may be (in this order) 
      zero or more flags, an _optional_ minimum field width, an _optional_ 
      precision and an optional length modifier."
  [in section "The precision"]:
    "An optional precision, in the form of a period ('.') followed by an 
      optional decimal digit string. 
    "Instead of a decimal digit string one may write "*" or "*m$" (for some 
      decimal integer m) to specify that the precision is given in the next 
      argument, or in the m-th argument, ...
    "This gives the ... the maximum number of characters to be printed from 
      a string for s and S conversions.
  [in section "The conversion specifier, s"]:
    "If a precision is specified, no more bytes than the number specified are 
      written, ...

Other examples:
  Other specifiers (f shown here) seem to share the bug:
  $ printf "%*.*f\n" 8 2 123.4567890 # "*.*" OK
    123.46
  $ printf "%8.*f\n" 2 123.4567890   # "m.*" Broken
       123


Configuration info:
running Fedora 11 with all available updates installed

$ bash --version
GNU bash, version 4.0.23(1)-release (i386-redhat-linux-gnu)

$ uname -a
Linux [hostname masked for privacy].net 2.6.30.10-105.2.23.fc11.i686.PAE #1 SMP 
Thu Feb 11 07:05:37 UTC 2010 i686 athlon i386 GNU/Linux

$ sudo lshw
[hostname masked for privacy].net
    description: Desktop Computer
    product: GA-MA78GM-US2H
    vendor: Gigabyte Technology Co., Ltd.
    width: 32 bits
    capabilities: smbios-2.4 dmi-2.4 smp-1.4 smp
    configuration: boot=normal chassis=desktop cpus=2 uuid=30303234-[masked for 
privacy]
  *-core
       description: Motherboard
       product: GA-MA78GM-US2H
       vendor: Gigabyte Technology Co., Ltd.
       physical id: 0
       version: x.x
     *-firmware
          description: BIOS
          vendor: Award Software International, Inc.
          physical id: 0
          version: F3 (03/11/2009)
          size: 128KiB
          capacity: 960KiB
          capabilities: isa pci pnp apm upgrade shadowing cdboot bootselect 
socketedrom edd int13floppy360 int13floppy1200 int13floppy720 int13floppy2880 
int5printscreen int9keyboard int14serial int17printer int10video acpi usb agp 
ls120boot zipboot biosbootspecification
     *-cpu:0
          description: CPU
          product: AMD Athlon(tm) 7750 Dual-Core Processor
          vendor: Advanced Micro Devices [AMD]
          physical id: 4
          bus info: c...@0
          version: 15.2.3
          slot: Socket M2
          size: 1350MHz
          capacity: 3GHz
          width: 64 bits
          clock: 200MHz
... [more output available if needed]



Reply via email to