ruby-trunk-changes r43702 - r43709

今日は SystemStackError の検出を精密化して稀に SEGV する現象の修正や、 at_exit での callcc の呼び出しの再修正などがありました。

nobu:r43702 2013-11-18 11:29:58 +0900

VM のスタックオーバフロー検出のマクロをリファクタリングしています。

svn:r43703 2013-11-18 11:30:03 +0900

version.h の日付更新。

nobu:r43704 2013-11-18 13:04:41 +0900

configure で warnflags に -Werror=division-by-zero を追加してゼロ除算(定数の場合だと思います)の警告をエラー扱いにするようにしています。 r43702 で追加したマクロにゼロ除算を使ってコンパイル時の定数チェックをしているものがあるのでそれをエラー扱いにするためと思われます。

nobu:r43705 2013-11-18 22:45:51 +0900

at_exit のブロック内での callcc による再実行の修正 r43685 の再修正。ブロックを実行する度に登録してあるブロックをリストから外して逐次削除するようにしています。 [ruby-core:58329] [Bug #9110]

nobu:r43706 2013-11-18 22:47:12 +0900

pthread_get_stackaddr_np(3) および pthread_get_stacksize_np(3) が利用可能な時にメインスレッドのスタックサイズも取得できるようにしています。 get_main_stack() を呼び出す条件コンパイルの条件を整理して、本当は呼べるのに読んでいなかった環境に対応しているみたいです。

nobu:r43707 2013-11-18 22:47:56 +0900

マシンスタックのオーバフロー検出は完全ではなくて稀に SEGV することがあることが以前より知られていますが*1、チェックのための struct rb_vm_tag をリストに繋げる前に setjmp(3) を呼ぶようにしています。 setjmp() もオーバフローを置こす可能性があり、その時に既にタグがリストに繋がれているとオーバフローした状態に戻すことになるので結局 SEGV してしまっていたようです。このため rb_vm_tag のリストとそこに格納されている jmpbuf の関係が TH_PUSH_TAG() から TH_EXEC_TAG() までの間だけ中途半端なことになっているので内部を弄る人にとっては注意が必要そうです。これ絶対別の人がうっかり間違えてギャーってなりますね。 [ruby-dev:47804] [Bug #9109]
これでもうスタックオーバフローで SEGV は起きなくなるんでしょうか?

nobu:r43708 2013-11-18 23:19:16 +0900

C の型のサイズを取得する RbConfig::SIZEOF を自動生成する sizes.c で実装していたのを拡張ライブラリ ext/rbconfig/sizeof として実装するように変更しています。多分自動生成するソースの依存関係とかの調整が大変だったとかではないかと思います。

nobu:r43709 2013-11-18 23:21:25 +0900

r43708 で新規追加されたディレクトリの svn property 設定。

*1:完全なチェックを行なおうとすると著しく遅くなりうるので性能劣化との兼ね合いで許容しているという理解です