sprintf bug in 1.9.0?

Discussion in 'Ruby' started by Mark Hubbart, Feb 16, 2004.

  1. Mark Hubbart

    Mark Hubbart Guest

    I just compiled the latest release of Ruby 1.9.0, and I'm getting
    unexpected behavior from it...

    mark@imac% /usr/local/bin/ruby -e'puts sprintf("%08b",0),RUBY_VERSION'
    11111110
    1.9.0
    mark@imac% /usr/bin/ruby -e'puts sprintf("%08b",0),RUBY_VERSION'
    00000000
    1.6.8

    it looks like sprintf, when you ask it to pad binary values with zeros,
    is instead padding with ones! It doesn't seem t have a problem with
    hex, just binary.

    -Mark
     
    Mark Hubbart, Feb 16, 2004
    #1
    1. Advertising

  2. Mark Hubbart

    Guest

    Hi,

    At Mon, 16 Feb 2004 19:49:36 +0900,
    Mark Hubbart wrote in [ruby-talk:92961]:
    > I just compiled the latest release of Ruby 1.9.0, and I'm getting
    > unexpected behavior from it...
    >
    > mark@imac% /usr/local/bin/ruby -e'puts sprintf("%08b",0),RUBY_VERSION'
    > 11111110
    > 1.9.0
    > mark@imac% /usr/bin/ruby -e'puts sprintf("%08b",0),RUBY_VERSION'
    > 00000000
    > 1.6.8


    What's your platform?

    $ ruby -v -e'puts sprintf("%08b",0),RUBY_VERSION'
    ruby 1.9.0 (2004-02-15) [i686-linux]
    00000000
    1.9.0

    --
    Nobu Nakada
     
    , Feb 16, 2004
    #2
    1. Advertising

  3. Mark Hubbart

    ts Guest

    >>>>> "n" == nobu nokada <> writes:

    n> $ ruby -v -e'puts sprintf("%08b",0),RUBY_VERSION'

    moulon% ruby -ve 'puts sprintf("%08b",0),RUBY_VERSION'
    ruby 1.8.1 (2003-12-25) [sparc-solaris2.7]
    11111110
    1.8.1
    moulon%


    Guy Decoux
     
    ts, Feb 16, 2004
    #3
  4. Mark Hubbart

    Mark Hubbart Guest

    > What's your platform?

    Guess I should have mentioned that :) Again, but with full
    version/release/platform tag:

    mark@imac% /usr/bin/ruby -ve 'puts sprintf("%08b",0)'
    ruby 1.6.8 (2002-12-24) [powerpc-darwin7.0]
    00000000
    mark@imac% /usr/local/bin/ruby -ve 'puts sprintf("%08b",0)'
    ruby 1.9.0 (2004-02-14) [powerpc-darwin]
    11111110
     
    Mark Hubbart, Feb 16, 2004
    #4
  5. Mark Hubbart

    Mark Hubbart Guest

    On Feb 16, 2004, at 3:12 AM, ts wrote:

    >>>>>> "n" == nobu nokada <> writes:

    >
    > n> $ ruby -v -e'puts sprintf("%08b",0),RUBY_VERSION'
    >
    > moulon% ruby -ve 'puts sprintf("%08b",0),RUBY_VERSION'
    > ruby 1.8.1 (2003-12-25) [sparc-solaris2.7]
    > 11111110
    > 1.8.1
    > moulon%
    >
    >
    > Guy Decoux
    >
    >

    Hmmmm... I hadn't thought to check 1.8, but I had it hanging around,
    too, so:
    mark@imac% /usr/local-old/bin/ruby -ve 'puts sprintf("%08b",0)'
    ruby 1.8.0 (2003-08-04) [powerpc-darwin]
    11111110

    there we are! I hadn't noticed that bug before, but then I guess I
    don't convert to binary strings very often...
     
    Mark Hubbart, Feb 16, 2004
    #5
  6. Mark Hubbart

    ts Guest

    >>>>> "t" == ts <> writes:

    t> moulon% ruby -ve 'puts sprintf("%08b",0),RUBY_VERSION'
    t> ruby 1.8.1 (2003-12-25) [sparc-solaris2.7]

    Not really sure (the problem is on line 566 in sprintf.c)

    if (bignum && !RBIGNUM(val)->sign)
    c = sign_bits(base, p);


    moulon% diff -u sprintf.c~ sprintf.c
    --- sprintf.c~ Thu Jul 3 13:00:18 2003
    +++ sprintf.c Mon Feb 16 13:40:08 2004
    @@ -345,6 +345,7 @@
    long v = 0;
    int base, bignum = 0;
    int len, pos;
    + VALUE tmp;

    switch (*p) {
    case 'd':
    @@ -472,8 +473,8 @@
    }

    if (sign) {
    - val = rb_big2str(val, base);
    - s = RSTRING(val)->ptr;
    + tmp = rb_big2str(val, base);
    + s = RSTRING(tmp)->ptr;
    if (s[0] == '-') {
    s++;
    sc = '-';
    @@ -493,8 +494,8 @@
    val = rb_big_clone(val);
    rb_big_2comp(val);
    }
    - val = rb_big2str(val, base);
    - s = RSTRING(val)->ptr;
    + tmp = rb_big2str(val, base);
    + s = RSTRING(tmp)->ptr;
    if (*s == '-') {
    if (base == 10) {
    rb_warning("negative number for %%u specifier");
    @@ -502,8 +503,8 @@
    }
    else {
    remove_sign_bits(++s, base);
    - val = rb_str_new(0, 3+strlen(s));
    - t = RSTRING(val)->ptr;
    + tmp = rb_str_new(0, 3+strlen(s));
    + t = RSTRING(tmp)->ptr;
    if (!(flags&FPREC)) {
    strcpy(t, "..");
    t += 2;
    @@ -520,7 +521,7 @@
    bignum = 2;
    }
    }
    - s = RSTRING(val)->ptr;
    + s = RSTRING(tmp)->ptr;

    format_integer:
    pos = -1;
    moulon%


    Guy Decoux
     
    ts, Feb 16, 2004
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. jwesley

    Sprintf bug

    jwesley, Nov 11, 2005, in forum: Ruby
    Replies:
    8
    Views:
    187
  2. Replies:
    4
    Views:
    204
    Leslie Viljoen
    Jul 29, 2006
  3. Wes Gamble

    Bug in sprintf?

    Wes Gamble, Aug 18, 2006, in forum: Ruby
    Replies:
    23
    Views:
    357
    Hal Fulton
    Aug 20, 2006
  4. Peter Szinek

    sprintf bug (?)

    Peter Szinek, Nov 11, 2006, in forum: Ruby
    Replies:
    8
    Views:
    197
    Bernard Kenik
    Nov 14, 2006
  5. Daniel DeLorme

    sprintf bug?

    Daniel DeLorme, Feb 1, 2008, in forum: Ruby
    Replies:
    1
    Views:
    108
    Robert Klemme
    Feb 1, 2008
Loading...

Share This Page