👌
[Bug #21151] StringIO が読み取り専用のメソッドでも FrozenError が発生するというバグ報告
[Bug #21151] IO and StringIO raise FrozenError even for read-only methods
-
StringIOが読み取り専用のメソッドでもFrozenErrorが発生するというバグ報告 - 例えば
StringIO#linenoは読み取り専用のメソッドなんですが#freezeしているとエラーが発生します
require "stringio"
s = StringIO.new
# no error
p s.lineno
s.freeze
# error: can't modify frozen StringIO: #<StringIO:0x00007f5c50883138> (FrozenError)
p s.lineno
-
#lineno以外にも#close?や#eof?メソッドも該当するみたいですね - これは内部で間接的に
rb_check_frozenを呼び出しているのが原因で意図する挙動ではないみたいなのかな? - 対応するメソッドとしてはいかがあげられています
- string (returns underlying String but does not mutate anything)
- lineno
- pos
- closed?/closed_read?/closed_write?
- eof/eof?
- sync
- pid (a dummy method but it writes nothing)
- fileno (dummy)
- pread (by definition does not modify state)
- isatty/tty?
- size/length
- external_encoding
- internal_encoding
- また
StringIOではないんですがIOは『書き込み可能である必要がある』とコメントされていますねー- https://bugs.ruby-lang.org/issues/21151#note-3
- IO によっては『読み込み処理でも書き込まれることがある』とのこと
- コメントだと OpenSSL が例にあげられていました
- https://github.com/openssl/openssl/commit/b1d6e3f551ce7e081ed3e30d525253042ebb10a4
- 確かに通信系だとそういうことはありそう
Discussion