安全な-with-rtsopts=*オプション

 これまでの回で何度かGHCのRTSオプションを使ってきましたが,RTSオプションを通じてアクセス権限を変更できてしまうという脆弱性が今年になって発見されました。この問題を解決するために,2010年11月16日にリリースされたGHC 7.0.1では,一部の安全性が保証されているRTSオプションを除き,デフォルトではRTSオプションを無効にするよう変更されました(参考リンク1参考リンク2参考リンク3)。

$ ghc -threaded -fdph-par -Odph VectTest.hs
[1 of 2] Compiling QSortVect        ( QSortVect.hs, QSortVect.o )
[2 of 2] Compiling Main             ( VectTest.hs, VectTest.o )
Linking VectTest.exe ...

$ VectTest +RTS -N
VectTest.exe: Most RTS options are disabled. Link with -rtsopts to enable them.

 GHC7.0.1からは,プロンプト上でRTSオプションを利用するには,-rtsoptsオプションを使って明示的にすべてのRTSオプションを有効にする必要があります。また,-rtsoptsオプションにallを渡すことでも,すべてのRTSオプションを有効にできます(参考リンク1,(参考リンク))。

$ ghc -threaded -fdph-par -Odph VectTest.hs -rtsopts (あるいは -rtsopts=all)
[1 of 2] Compiling QSortVect        ( QSortVect.hs, QSortVect.o )
[2 of 2] Compiling Main             ( VectTest.hs, VectTest.o )
Linking VectTest.exe ...

$ VectTest +RTS -N
[:6.911810487508774e-6,2.0454637706279755e-5,2.4136854335665703e-5,5.67741226404
~ 略 ~
920547366,0.9999940111301839:]

 しかし,こうした方法はセキュリティ面で問題があります。GHC7.0.1では,HaskellプログラムにRTSオプションを渡すための方法の一つとして,新たに-with-rtsopts=*オプションを提供しています。-with-rtsopts=*オプションは,Haskellプログラムのバイナリを作成するためのリンクの際に,「=*」で指定したRTSオプションをHaskellプログラムに渡すものです。-with-rtsopts=*オプションを使えば,実行時にコマンドラインでRTSオプションを渡す代わりに,使うべきRTSオプションをリンク時に指定できます(参考リンク)。

$ ghc -threaded -fdph-par -Odph VectTest.hs -with-rtsopts="-N"
[1 of 2] Compiling QSortVect        ( QSortVect.hs, QSortVect.o )
[2 of 2] Compiling Main             ( VectTest.hs, VectTest.o )
Linking VectTest.exe ...

$ VectTest
[:3.0156224966049194e-6,9.401468560099602e-6,2.758740447461605e-5,4.668859764933
~ 略 ~
9556751996,0.9999752989970148,0.9999979769345373:]

 -with-rtsopts=*オプションを使うことで,作成済みのHaskellプログラムを利用するユーザーがRTSオプションを指定する場合に比べて,安全にHaskellプログラムを運用できます。

 GHCでは,-with-rtsopts=*オプション以外にも,RTSオプションをリンク時に渡す様々な方法が用意されています(参考リンク)。


著者紹介 shelarcy

 今回紹介したcriterionは,「確実な Java ベンチマーク: 第 1 回」,「第 2 回」(原題:「Robust Java benchmarking」)という記事に影響を受けて開発されたものです(参考リンク)。興味のある方は,これらの記事や関連の「Java benchmarking article」を参照するとよいでしょう。

 Java仮想マシン上で動作するLISP系言語のClojureにも,これらの記事やcriterionの影響を受けて作成されたCriteriumというライブラリがあるそうです(参考リンク)。将来は,criterionのような統計的な手法を使ったベンチマーク・ライブラリが様々な言語で使われるようになるかもしれません。