A mere hateblo

単なるはてブロです。

FreeBSD portsのdevel/boost-libsが1.45.0のままな件について

http://www.FreeBSD.org/cgi/query-pr.cgi?pr=ports/156253

現状send-prされたものでopenなものはこれだけで、どうもboost 1.46.1へのアップデートを提案したところ関連portで不具合が起き、対処している間にboostのバージョンが上がっていった、と。現在はboostを利用するportの不具合を改善しつつ新しいboostへの対応パッチを用意している感じか。

最新のパッチ(http://alexanderchuranov.com/boost-port/boost-145-to-148-v03.diff)を読むと1.46.1へのアップデートの際に出されたパッチ(http://alexanderchuranov.com/boost-port/boost-1.45-to-1.46.1_attempt05.diff)よりシンプルになってるから、1.49.0への対応もそれほど困難ではないだろう。問題はいつリポジトリに反映されるか、なんだけど、これはもう待つしかないかなあという印象。

そもそもなんでこんなことを調べ始めたかというと、Mac OS X上で書いたboost::randomを使った実装をFreeBSDで実行したらSIGFPEが発生したことが発端。再現サンプルは次の通り:

#include <iostream>
#include <boost/random.hpp>

int main()
{
  boost::mt19937 gen(static_cast<unsigned long>(time(NULL)));
  boost::uniform_smallint<uint32_t> dst(0x00000000u, 0xffffffffu);
  boost::variate_generator<boost::mt19937 &, boost::uniform_smallint<uint32_t> > rand(gen, dst);
  std::cout << rand() << std::endl;
  return 0;
}

上記コードはuint32_tな値を0x00000000〜0xffffffffの範囲で欲しいというもの。これがboost 1.45.0ではSIGFPEが発生し、boost 1.49.0ならば発生しない。

Mac OS XではHomebrewを使ってboost 1.49.0を、FreeBSDではportを使ってboost 1.45.0をインストールしている。boost 1.45.0でSIGFPEが発生する場所は https://github.com/boost-lib/random/blob/1.45.0/include/boost/random/uniform_smallint.hpp#L120 あたり:

    r_base += 1;
    if(r_base % _range == 0) {
      // No quantization effects, good
      _factor = r_base / _range;

経緯の説明は省くが、120行目でゼロ除算が起き例外が発生する。この部分はboost 1.47.0で大きく実装が変更されている。boost公式サイトのリポジトリのログも「Update uniform_smallint」のみで詳細は不明。

そんなこんなでFreeBSD portsで新しいboostをインストールしたいのになぜboost 1.45.0のままなのだろう、と調べ始めた結果がこの記事の前半である。