今日は主に irb の出力に色をつける対応や組込みIDの不具合修正、MSAN/ASAN で検出した不具合修正などがありました。
[2272cb00ea] Nobuyoshi Nakada 2019-04-25 20:33:18 +0900
parse.y で拡張ライブラリ ripper 向けの実装の時には internal_id() で組み込みのSymbolのIDは利用しないようにしています。
[790f6709ae] Kazuhiro NISHIYAMA 2019-04-25 23:46:47 +0900
NEWS ファイルに $, に nil 以外を設定すると警告が出るようになることを追記しています。
[94af6cd383] Takashi Kokubun 2019-04-26 00:47:39 +0900
標準添付ライブラリ irb に lib/irb/color.rb というファイルを追加して端末の色付けのためのライブラリを追加しています。そして Binding#irb で周辺のソースを表示する時に色付けして表示するようにしています。 https://github.com/ruby/ruby/pull/2150
[b55201dd09] Takashi Kokubun 2019-04-26 00:47:40 +0900
94af6cd383f9dc3ae1204a5fba8f56ee7826cbce の続きで irb でコードを評価した結果のオブジェクトを inspect した結果の出力も色付けするようにしています。 https://github.com/ruby/ruby/pull/2150
[022cbb278f] Pocket7878 2019-04-26 00:47:42 +0900
94af6cd383f9dc3ae1204a5fba8f56ee7826cbce の再修正で色付けするかどうかを$stdoutが端末かどうかと環境変数TERMがあるかで判定していましたが、TERMの値が "dump" だった時は色付けしないようにしています。 https://github.com/ruby/ruby/pull/2150
[0c54d2e2c7] Takashi Kokubun 2019-04-26 00:47:43 +0900
irb の色付けのテストで色がつくように StringIO のインスタンスに特異メソッド tty? を追加したり環境変数TERMをセットしたりして実行するようにするhelperメソッド with_term を追加しています。 https://github.com/ruby/ruby/pull/2150
[e64bab5f77] Takashi Kokubun 2019-04-26 00:53:38 +0900
NEWS ファイルにirb の色付けについて追記しています。
[2422316aea] Takashi Kokubun 2019-04-26 01:18:39 +0900
NEWS ファイルの irb の色付けについての記述に pry.gem を参考にした旨追記しています。
[5689c46457] git 2019-04-26 01:43:26 +0900
version.h の日付更新。
[54eac83b2a] Nobuyoshi Nakada 2019-04-26 09:33:48 +0900
2272cb00eadcbc48640c69fcd6a30e45a5977cd5 の続きと思われますがparse.yのinternal_id()でIDを採番する時にカウントアップしていくのでなくてRB_ID_SERIAL_MAXからカウントダウンしていくようにして、組み込みのSymbolのIDの領域に突き抜けるのを防いでいる? のだと思います。テストをみるとたくさんの無名ブロックパラメータを持つ Proc の parameters におかしな値が混じるという不具合の修正。
チケットの参照として [Bug #15768] のほうが書かれてるんですが、たぶんこれは [Bug #15786] の間違いじゃないかと。
[b6ebbee5d6] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
vm_insnhelper.c の vm_callee_setup_arg() で警告除去のために明示的なキャスト追加。
[171a6ad1c1] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
VM 命令の leaf フラグが正しいかチェックするための canary の不整合検出時のメッセージが空文字列になってたので disasm した命令を含めるようにしています。コメントアウトされた状態になってたのを戻しています。
[bdd1b300f8] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
transient_heap.c の transient_heap_block_update_refs() で警告除去のため明示的キャストを追加。
[1f4204a762] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
gc.c の newobj_init() でflags をチェックしているところは未初期化領域の参照になる可能性があり MSAN によるチェックと相性が悪いので、__hash_feature(memory_sanitizer) でチェックして有効な時は削るように preprocessor の分岐を追加しています。
[fa09acafde] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
ASAN, MSAN が有効な時に vm_core.h で machine stack のサイズを大きめに定義しなおすようにしています。ASAN/MSAN 利用時には machine stack の消費量が増えるみたいです。
[572f2ddff6] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS() というマクロを追加して局所的に MSAN/ASAN を同時に無効にできるようにしています。
[6201a89b38] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
572f2ddff64ddf12f2331ad77b72d2b0c9d9883c で定義した ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS() を使って transient_heap.c の transient_heap_ptr_check()、transient_heap_block_verify()、transient_heap_ptr() などをチェック対象外に指定しています。
[b11b26bcaf] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
transient_heap.c の rb_transient_heap_alloc() で unpoison_memory_region() でアドレスのチェック対象に戻す領域をヘッダぶん減らしています。ptr は header を1つインクリメントした位置からのポインタなので size とすると末尾ポインタ1つぶんはみ出した領域まで指定してしまっていました。こういう指定自体のオーバーランもチェックされるんでしょうね、やっぱり。
[504ce460d2] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
vsprintf.c の vfprintf() も ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS でメモリチェック対象外にしています。
[3ba485c0bf] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
gc.c の mark_current_machine_context() で setjmp() で register の内容を退避する前に save_regs_gc_mark をゼロクリアしておくようにしています。
[f02760fc0a] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
rb_autoload_load() で排他処理のために持つ構造体 struct autoload_state のメンバー result を Qfalse で初期化しておくようにしています。MSAN で未初期化領域の参照が検出されたようですね。
[40b5f2b85d] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
enum.c の enum_sum() でも未初期化領域の参照を防ぐため struct enum_sum_memo のメンバーの明示的初期化を追加しています。
[1aa05fddd8] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
b11b26bcaf711ad01d1a81943cca42f7ff40bfee と類似ですが transient_heap.c の clear_marked_index() でヘッダ部分のメモリの unpoison の呼び出しが漏れてたので追加しています。
[aa190abe20] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
obj_ivar_heap_alloc() の呼び出し結果の NULL チェックしているところがありましたが、NULL にはなりえないということで分岐を消してかわりに assert() を追加しています。
[2a863d4bab] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
VM 命令の leaf フラグをチェックする vm_check_canary() で reg_cfp がまだ VM スタックの底を指してる時に不正な領域を参照してしまうのを防ぐように先に return するようにしています。
[7b7043e5da] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
Kernel#` (バッククオートでくくってコマンド実行するやつ)で rb_io_close() を呼んだ後で解放済みの領域を参照してしまうのを防ぐため IO オブジェクトの fptr を NULL にクリアしています。
[2a49a47956] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
.travis.yml の MSAN/ASAN つきビルド時の cflags などに -fPIC を追加しています。また openssl/readline や libgmp (Bignum の実装に使うやつ)などを利用しないように configure の引数を設定するようにしています。
[d700a8a0eb] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
.travis.yml の clang を使ったビルドに clang-8 を使うようにしています。clang-7 には memory sanitizer の誤検出があるらしいとのこと。
[267ac0624d] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
.travis.yml の make-test-only というビルドで環境変数 GEMS_FOR_TEST を空にして bundled gem のテストをスキップさせるようにしています。
[0523b02f48] Urabe, Shyouhei 2019-04-26 15:59:40 +0900
267ac0624dad6be5c3f4760f691258ae7dc83861 の変更では GEMS_FOR_TEST のクリアがうまくできなかった(YAML のエントリで alias 使うと項目ごとに上書きになるので配列の内容をマージしてくれない)ので必要な場所に設定をばらまくようにしています。
[1cef6a0c0c] Kazuhiro NISHIYAMA 2019-04-26 17:47:23 +0900
r67347 あたりからの Travis-CI の Permission Denied のエラーのデバッグにさらに miniruby を使って mtime と ctime を表示するようにしています。numbered parameter を使ってますね。
[a93f555699] Takashi Kokubun 2019-04-26 18:18:09 +0900
tool/sync_default_gems.rb で ../ に対象のディレクトリがない場合にエラーにするようにしています。
[a6805771ec] Takashi Kokubun 2019-04-26 18:25:56 +0900
make sync-default-gems というターゲットを追加して tool/sync_default_gems.rb を実行できるようにしています。
[52cfb17086] Takashi Kokubun 2019-04-26 18:28:57 +0900
default gem としての upstream から irb を同期しています。色付けのまわりで若干修正されてますね。
[a429b3601f] Takashi Kokubun 2019-04-26 18:46:43 +0900
6669c966d2744f21315047d1725ad4494d15b8ba を revert しています。テストが失敗したとのこと。