きりかノート 3冊め

おあそびプログラミング

MacOSX10.8(Mountain Lion)付属のrubyでbignum(?)に問題

(7/26 タイトルに"Mountain Lion"を入れました)

2**64 => 0 なんだよっ。そんなバカな!という話。

ruby-listに注意のお知らせを出したのでそれをコピペ。

[ruby-list:48855]MacOSX10.8付属のrubyでbignum(?)に問題

先日リリースされた、Mac OS X 10.8に付属のruby(1.8.7)でbignumまわりの計算で問題があるようです。

   % /usr/bin/ruby -v
   ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]
   % /usr/bin/ruby /usr/bin/irb
   >> 2**62
   => 4611686018427387904
   >> 2**63
   => -9223372036854775808
   # 負の数になるのはおかしい。正しくは +9223372036854775808
   >> 2**64
   => 0
   # 正しくは +18446744073709551616

原因としては、clangでコンパイルされているためのようです。

   % /usr/bin/ruby -rrbconfig -e 'p Config::CONFIG["CC"]'
   "xcrun cc"
   % xcrun cc --version
   Apple clang version 4.0 (tags/Apple/clang-421.0.57) (based on LLVM 3.1svn)
   Target: x86_64-apple-darwin12.0.0
   Thread model: posix

当面は自前でコンパイルしたrubyを使ったほうが良いかもしれません。
Appleには、rdar://11806241 として報告済みです。

影響がどのくらいあるのかわからないのですが、とりあえず注意喚起のお知らせでした。

補足説明など

先日から調べていた、clang -Osでコンパイルするとbignumのテストが失敗する件(その1その2)です。

  • ruby-1.8.7はclang非対応
  • Xcode-4.4はclangとllvm-gcc(`gcc')で、ふつうのgccがない。
    • llvm-gccはざんねんクオリティなので基本的に使ってはいけない。

という状況なので、回避策としては

あたりになります。特に1.8でないと困る状況でない場合は、この際に1.9に移行するのがいちばん良いと個人的には思います。

気付いた経緯

  1. 10.8のDeveloper previewMacPortsを確認
  2. port:apple-gcc42入らねえじゃん
  3. OS付属のrubyはどうなってるんだ?
  4. CC="xcrun cc"だと…?
  5. make testパスしないじゃないか!

という感じ。rbconfigを直接編集してる可能性もあるので、ぜったいに"xcrun cc"かは言えないんだけど、動作的にほぼ確実。

ていうかさあ、、、make testくらいは確認しておこうよ…>Apple