ruby-trunk-changes r57961 - r57971

今日は coverage や Thread.new(&:sym), Fiber.new(&:sym) などで SEGV していた不具合の修正などがありました。

nobu: r57961 2017-03-13 20:47:45 +0900

string.c の rb_str_set_len() に引数の len が負の時のチェックというのを一応入れています。

nobu: r57962 2017-03-13 23:59:08 +0900

rb_str_format() でフォーマット文字列の末尾に単独の % があると 1文字ぶん out-of-bound のメモリアクセスしてしまうのでスキップして終端にするようにしています。

stomar: r57963 2017-03-14 05:20:40 +0900

String#<=>, Symbol#<=>, String#casecmp, Symbol#casecmp の rdoc 用コメントなどにサンプルを追加したりしています。

svn: r57964 2017-03-14 05:20:40 +0900

version.h の日付更新。

nobu: r57965 2017-03-14 12:42:43 +0900

rb_str_cmp_m() で引数のクラスのチェックや String オブジェクトへの変換を rb_check_string_type() で行なって、変換できない時の処理をシンプルにしています。

nobu: r57966 2017-03-14 13:03:48 +0900

vm_core.h の vm_proc_block() で VM_ASSERT() で procval の型チェックをしてから RTYPEDDATA_DATA() マクロでアクセスするように位置を移動しています。また vm_proc_iseq() での VM_ASSERT() は消しています。

nobu: r57967 2017-03-14 13:16:02 +0900

テスト用のユーティリティ EnvUtil の diagnostic_reports で ruby の実行形式ファイルのパスを basename のみにするようにしています。

nobu: r57968 2017-03-14 14:54:33 +0900

thread_start_func_2() から Thread が実行するブロックの Proc オブジェクトの環境をセットアップして呼び出す処理を thread_do_start() という関数に切り出しています。

nobu: r57969 2017-03-14 14:54:35 +0900

Thread.start に Symbol をブロック引数として渡し(内部的に to_proc したものを呼ばせる)と SEGV していた不具合を修正しています。 r57968 で切り出した thread_do_start() で vm_proc_ep() が NULL の時に th->root_ep への設定で NULL ポインタアクセスしてしまっていたのを回避するようにしています。 [ruby-core:80147] [Bug #13313]

ko1: r57970 2017-03-14 15:52:44 +0900

r57969 と同様に Fiber.new に Symbol をブロック引数化して渡すと SEGV するようになっていたので NULL チェックを含んだアクセサ rb_vm_proc_local_ep() を切り出して rb_fiber_start() でもこれを利用するようにしています。 [ruby-core:80147] [Bug #13313]

mame: r57971 2017-03-14 20:39:58 +0900

compile.c の iseq_compile_each0() で option->coverage_enabled が Qfalse の時に ISEQ_COVERAGE(iseq) が Qnil でないといけないのに NODE_PRELUDE のコンパイル時に一時的に option を書き換えているところでその条件が崩れていたのを修正しています。拡張ライブラリ coverage を使った時に SEGV することがあったみたいです。 [ruby-core:80079] [Bug #13305]