ruby-trunk-changes r59866 - r59897

今日は主に拡張ライブラリ coverage に experimental な拡張機能として branch coverage と method coverage の計測機能が追加されました。また標準添付ライブラリ webrick脆弱性修正も行なわれています。
また今日は他にも先日リリースされた RubyGems脆弱性修正はじめいくつかの security fix を含む安定版(2.4.2/2.3.5/2.2.8)のリリースも行われました。

kazu: r59866 2017-09-13 21:46:13 +0900

Random.urandom の rdoc 用コメントに例外が発生することがあることを記述しています。 r59858 の変更に追随ですね。

suke: r59867 2017-09-13 22:24:59 +0900

拡張ライブラリ win32ole のテストで Word.Application という Win32OLE の定数を取り込むための Word という定数を導入して、ウィンドウを閉じる時のダイアログを抑制するようにしています。 [ruby-core:82770] [Bug #13894]

nobu: r59868 2017-09-14 00:28:16 +0900

Windows 環境(mswin, mingw, cygwin いずれも)で LIBPATHENV に PATH を設定しておくように configure および win32/Makefile.sub を修正しています。

svn: r59869 2017-09-14 00:28:17 +0900

version.h の日付更新。

nobu: r59870 2017-09-14 02:07:19 +0900

環境変数 PATH および RUBYPATH の影響を確認するテストで PATH は Windows などの環境ではライブラリのサーチパスにもなっているので、元の値を消さないようにしています。 https://github.com/ruby/ruby/pull/1616 [ruby-core:81178] [Bug #13569]

mame: r59871 2017-09-14 10:55:30 +0900

VM の命令に trace2 という命令を追加しています。どうも coverage 用に使うために任意のオブジェクト(VALUE)を operand に取るようです。

ko1: r59872 2017-09-14 10:55:59 +0900

r59845 の rdoc の更新でテストに入り込んだ未使用変数を削除しています。警告抑制のため。

hsbt: r59873 2017-09-14 11:01:36 +0900

標準添付ライブラリの gemspec (default gem のぶん)のバージョンやら homepage やら files を更新しています。

mame: r59874 2017-09-14 11:36:26 +0900

拡張ライブラリ coverage に experimental の拡張を導入して、環境変数 COVERAGE_EXPERIMENTAL_MODE を設定しておくと Coverage.start にキーワード引数で coverage 測定の種類が指定できて、Coverage.result が返す結果の構造も変化するようになっています。 :lines, :branches, :methods といった種類を受け付けてて、Coverage.result の構造にも反映されるようですが、このコミットの時点ではまだ実際に計測されるのは lines だけみたいです。

mame: r59875 2017-09-14 11:53:54 +0900

r59874 の experimental な機能を off にした時の引数チェックが間違ってたのを修正。

mame: r59876 2017-09-14 12:25:36 +0900

r59874 で追加した :branch モードの実装を追加しています。compile.c に branch coverage 測定用の trace2 命令の挿入マクロを実装して、まずは compile_if() に追加しています。また拡張ライブラリ coverage で結果を取り出す処理も追加しています。

mame: r59877 2017-09-14 12:36:05 +0900

r59876 に続き compile_loop() で while や until でも branch coverage 計測のための trace2 の挿入を追加しています。

hsbt: r59878 2017-09-14 12:57:22 +0900

r59876 の coverage.c の変更でパッチを当てた時の行頭の "+" が残ってたみたいなところがあったので修正しています。

mame: r59885 2017-09-14 13:32:58 +0900

r59874 からの続きで今度は compile_case() で case 文の branch coverage の計測のための trace2 命令挿入を追加しています。

mame: r59886 2017-09-14 13:42:23 +0900

case 文に値が渡されなかった時に行番号が保存されてなかったのを修正しています。branch coverage のために必要になったんですね。

hsbt: r59887 2017-09-14 14:04:38 +0900

macOS の APFS で File#atime のテストでタイムスタンプの nano seconds の精度の違いでテストが失敗していたそうで、apfs の時は秒単位までで丸めてチェックするように修正しています。またファイル名に不正な文字を使った時のテストも通らないので飛ばすようにしています。 [ruby-core:82383] [Bug #13816]

mame: r59888 2017-09-14 14:12:34 +0900

r59876 からの branch coverage 計測の追加に続いて method coverage の計測機能のためにメソッド定義のところに trace2 命令を追加するようにしています。メソッド定義毎にインデックスがふられるけど iseq 内毎だから、動的な定義とかだと ISeq が別々になるからあまりメソッド数の上限とかは気にしなくてもいい、のかな。

mame: r59889 2017-09-14 14:27:02 +0900

拡張ライブラリ coverage の branch coverage で unless 文による分岐は Coverage.results でも :unless という Symbol が使われるように区別できるようにしています。 if と unless は body と else を反転した NODE_IF で表現されてたので NODE_UNLESS を追加して AST の時点で区別を保持するようにしています。

mame: r59890 2017-09-14 15:07:05 +0900

make test-all などで ruby 本体の C のコードの coverage および標準添付ライブラリなどの ruby のコードの coverage を計測できるようにしています。 C のコードの coverage を計測するには configure 時に --enable-gcov オプションをつけておく必要があります。

mame: r59891 2017-09-14 16:45:17 +0900

拡張ライブラリ coverage の method_coverage() で未初期化で利用していた変数があったので修正。

nobu: r59892 2017-09-14 17:04:30 +0900

配列リテラルが条件部に書かれていた時に空配列なら newarray 命令と pop 命令を削れるので iseq_peephole_optimize() で最適化するようにしています。

naruse: r59893 2017-09-14 18:21:48 +0900

r59710 で macOS の時の SEGV の backtrace 表示で mincore(2) を使って ip が指すメモリにアクセス可能かチェックしていましたが、mincore() が vec に負の値をセットする場合があったので、frame を skip する条件判定を修正しています。 [ruby-core:82784] [Bug #13895]

mame: r59894 2017-09-14 19:45:04 +0900

拡張ライブラリ coverage の branch coverage および method coverage で測定結果を取り出す時に通し番号をつけるための変数の型を int から long に変更しています。分岐やメソッドが非常に多い時にオーバーフローしないように。

nobu: r59895 2017-09-14 19:49:29 +0900

parse.y にある ripper 用の関数での Ripper のメソッドの rdoc 用コメントの call-seq のメソッド呼び出しの記法を修正しています。

nobu: r59896 2017-09-14 19:53:47 +0900

拡張ライブラリ ripper に lexer (scanner) の状態を返す Ripper#state メソッドを追加しています。 [ruby-core:81789] [Feature #13686]

mame: r59897 2017-09-14 20:16:23 +0900

標準添付ライブラリ webrickアクセスログに出力する文字列が確実に escape されるようにする修正。 https://hackerone.com/reports/223363