[#48591] StringValuePtrでnull終止されてない文字列の作り方 — madoka yamamoto <yamamotomadoka@...>
山本ともうします。
5 messages
2014/10/05
[#48598] Re: StringValuePtrでnull終止されてない文字列の作り方
— "NARUSE, Yui" <naruse@...>
2014/10/06
まず、CRubyとしてはStringValuePtrがNUL終端する保証はしていませんから、仮にnull-terminateしてないことにより問題が起きるならば、
[#48666] Re: [ruby-cvs:55171] duerst:r48021 (trunk): common.mk: Added a rule to generate lib/unicode_normalize/tables.rb. — "Martin J. Dürst" <duerst@...>
中田さん、こんにちは。
3 messages
2014/10/19
[ruby-dev:48630] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
From:
nobu@...
Date:
2014-10-14 13:16:31 UTC
List:
ruby-dev #48630
Issue #10382 has been updated by Nobuyoshi Nakada.
RegexpはASCII-8BITになってもStringはスクリプトエンコーディングのままなので、意図的なCODERANGE_BROKENなのか、意図しないバグによるものなのか、区別する方法がないというのが問題ですね。
----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-49434
* Author: Akira Tanaka
* Status: Open
* Priority: Normal
* Assignee:
* Category:
* Target version:
* ruby -v: ruby 2.2.0dev (2014-10-14 trunk 47915) [x86_64-linux]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
以下のふたつのスクリプトの動作は一致するべきだと思うのですが、
前者と異なり後者は例外となります。
```
% cat z1.rb
# -*- encoding: US-ASCII -*-
r = /#{'\x80'}/
p [r, r.encoding]
% ./miniruby -v z1.rb
ruby 2.2.0dev (2014-10-14 trunk 47915) [x86_64-linux]
[/\x80/, #<Encoding:ASCII-8BIT>]
```
```
% cat z2.rb
# -*- encoding: US-ASCII -*-
s = '\x80'
r = /#{s}/
p [r, r.encoding]
% ./miniruby -v z2.rb
ruby 2.2.0dev (2014-10-14 trunk 47915) [x86_64-linux]
z2.rb:3:in `<main>': invalid multibyte escape (ArgumentError)
```
後者のスクリプトは前者のスクリプトの文字列 '\x80' を変数に代入してから
使っているだけの違いなので動作が変わる理由はないと思います。
ここでどちらが正しいかというのが問題ですが、前者が正しいのだと思います。
正規表現リテラルはスクリプトエンコーディングというのが原則で、
それだけなら US-ASCII なので \x80 は invalid で例外という後者が正しいのですが、
US-ASCII のスクリプト内で \x80 などを使うと自動的に ASCII-8BIT になるという仕様 ruby-dev:33348 があって、
動的な正規表現に対してこれが実装されていないように思います。
(静的な正規表現に関しての実装は reg_fragment_setenc_gen だと思います。)
--
https://bugs.ruby-lang.org/