今日はHaskellでちょっと奇妙なバグに悩まされた。 GHCiでは再現せず、最適化を有効にしてコンパイルすると再現するバグで、原因を追いかけてみると根本原因は (maxBound `div` 10 :: Word) の計算結果が、正しい値 429496729 ではなく謎の値 2576980377 になってしまうというもの。 こんなバグが残っているなんて、なんてしょうもないんだ、GHC!
……調べてみると、一応最新版では修正済みだった。
以下がバグ報告とそれに対する修正。
#8072 (Optimizations change result of div for Word) - GHC
https://ghc.haskell.org/trac/ghc/ticket/8072
Changeset af77ef4 in base
https://ghc.haskell.org/trac/ghc/changeset/af77ef45d576fddb25acf28beb434ef431f430a0/base
自分も定数畳み込み自体のバグかと最初は思ったのだけれど、実際は32bit環境でWordのmaxBoundの定義に64bit環境用の定義が使われてしまっているという、ある意味もっとしょうもないバグだった。
けれど、これが起こってしまった原因はなかなか面白い。
そして、謎の値 2576980377 は (0xFFFFFFFFFFFFFFFF `div` 10) .&. 0xFFFFFFFF だったと。
ただ、ちょっとだけ困るのは、現在最新の Haskell Platform の 2013.2.0.0 に同梱されている base-4.6.0.1 では未修正という点。
早く Haskell Platform の次のリリースがされないかなぁ……
こんな感じに… ➤ https://dayone.me/aCbzhl
# Day One の markdown renderer が腐ってて code block がマトモに rendering されてない orz
依存関係は sandboxing で… disk は食っちゃうのですが、グチャグチャになっても sandbox 消せば元通り。
恥ずかしながら cabal sandbox はまだ試したことないのですが、パッケージ依存関係の話は(sandboxで解決できそうな)複数プロジェクト間だけでなく、同時に使うライブラリ間でも結構困ってます。
しかも、往々にして、依存パッケージのバージョンの上限を適切に設定していない過去のバージョンのパッケージが悪さをして、変な依存関係の解決がされてしまって、ビルドエラーになったりとか…… (涙
> +Kei Hibino
自分も普段は64bit環境で使っていたので、今回たまたまハマるまで全然気づいてなかったです……