1.8 sprintf %b generates broken strings with GC.stress

GC.stress e$B$,F~$C$?$N$G;W$$N)$C$F$U$H;n$7$F$_$k$H!"e(B1.8 e$B$Ne(B
sprintf e$B$Ne(B %b e$B$Oe(B

“\000\242\272\3535+\000\000P{d\000\000\000\000\000ffffffffffff,\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\220\000\000\000\000\000\000\00000000000000000000000000000000000000000000000000000000000001”

e$B$J$I$H$$$&2u$l$?J8;[email protected]@.$9$k$3$H$,$"$k$h$&$G$9!#e(B

% cat x.rb
GC.stress=true

VS = [
-0x1000000000000000000000000000000000000000000000002,
-0x1000000000000000000000000000000000000000000000001,
-0x1000000000000000000000000000000000000000000000000,
-0xffffffffffffffffffffffffffffffffffffffffffffffff,
-0x1000000000000000000000002,
-0x1000000000000000000000001,
-0x1000000000000000000000000,
-0xffffffffffffffffffffffff,
-0x10000000000000002,
-0x10000000000000001,
-0x10000000000000000,
-0xffffffffffffffff,
-0x4000000000000002,
-0x4000000000000001,
-0x4000000000000000,
-0x3fffffffffffffff,
-0x100000002,
-0x100000001,
-0x100000000,
-0xffffffff,
-0xc717a08d,
-0x80000002,
-0x80000001,
-0x80000000,
-0x7fffffff,
-0x524b2245,
-0x40000002,
-0x40000001,
-0x40000000,
-0x3fffffff,
-0x10002,
-0x10001,
-0x10000,
-0xffff,
-0x8101,
-0x8002,
-0x8001,
-0x8000,
-0x7fff,
-0x7f01,
-65,
-64,
-63,
-62,
-33,
-32,
-31,
-30,
-3,
-2,
-1,
0,
1,
2,
3,
30,
31,
32,
33,
62,
63,
64,
65,
0x7f01,
0x7ffe,
0x7fff,
0x8000,
0x8001,
0x8101,
0xfffe,
0xffff,
0x10000,
0x10001,
0x3ffffffe,
0x3fffffff,
0x40000000,
0x40000001,
0x524b2245,
0x7ffffffe,
0x7fffffff,
0x80000000,
0x80000001,
0xc717a08d,
0xfffffffe,
0xffffffff,
0x100000000,
0x100000001,
0x3ffffffffffffffe,
0x3fffffffffffffff,
0x4000000000000000,
0x4000000000000001,
0xfffffffffffffffe,
0xffffffffffffffff,
0x10000000000000000,
0x10000000000000001,
0xffffffffffffffffffffffff,
0x1000000000000000000000000,
0x1000000000000000000000001,
0xffffffffffffffffffffffffffffffffffffffffffffffff,
0x1000000000000000000000000000000000000000000000000,
0x1000000000000000000000000000000000000000000000001
]

VS.each {|a|
s = sprintf("%b", a)
p s if /[^01.]/ =~ s
}
% ./ruby -v x.rb
ruby 1.8.7 (2008-04-19 patchlevel 5000) [x86_64-linux]
“\000\242\272\3535+\000\000\200\202d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\220\000\000\000\000\000\000\000111111111111111111111111111111111111111111111111111111111110”
“\000\242\272\3535+\000\000\020~d\000\000\000\000\0000000000000000000000000000000000000000,\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\220\000\000\000\000\000\000\000111111111111111111111111111111111111111111111111111111111111”
“\000\242\272\3535+\000\000\260|d\000\000\000\000\0000000000000001,\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\220\000\000\000\000\000\000\00000000000000000000000000000000000000000000000000000000000000”
“\000\242\272\3535+\000\000P{d\000\000\000\000\000ffffffffffff,\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\220\000\000\000\000\000\000\00000000000000000000000000000000000000000000000000000000000001”

At Tue, 22 Apr 2008 08:06:38 +0900,
Tanaka A. wrote:

GC.stress が入ったので思い立ってふと試してみると、1.8 の
sprintf の %b は

“\000\242\272\3535+\000\000P{d\000\000\000\000\000ffffffffffff,\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\220\000\000\000\000\000\000\00000000000000000000000000000000000000000000000000000000000001”

などという壊れた文字列を生成することがあるようです。

 ありがとうございます。まつもとさんが修正してくれました。

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs