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)です。
という状況なので、回避策としては
- 1.9系をclangで入れる
- gccを入れて(どうやってかは知らん)、1.8をコンパイルする
- numeric.cにパッチ(bugs.ruby-lang.org or gist)を当てて、clang -Osでコンパイルする(MacPortsのport:rubyはこれ)
- clang -O0でコンパイルする。最適化しないのでもちろんちょっと遅い。
あたりになります。特に1.8でないと困る状況でない場合は、この際に1.9に移行するのがいちばん良いと個人的には思います。