ruby-dev (Japanese) list archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-dev:48626] [ruby-trunk - Bug #10382] [Open] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
@ 2014-10-14 11:48 ` akr
  2014-10-14 13:16 ` [ruby-dev:48630] [ruby-trunk - Bug #10382] " nobu
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: akr @ 2014-10-14 11:48 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been reported by Akira Tanaka.

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382

* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48630] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
  2014-10-14 11:48 ` [ruby-dev:48626] [ruby-trunk - Bug #10382] [Open] s = '\x80'; /#{s}/ raises an exception in US-ASCII script akr
@ 2014-10-14 13:16 ` nobu
  2014-10-14 13:46 ` [ruby-dev:48631] " akr
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: nobu @ 2014-10-14 13:16 UTC (permalink / raw
  To: ruby-dev

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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48631] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
  2014-10-14 11:48 ` [ruby-dev:48626] [ruby-trunk - Bug #10382] [Open] s = '\x80'; /#{s}/ raises an exception in US-ASCII script akr
  2014-10-14 13:16 ` [ruby-dev:48630] [ruby-trunk - Bug #10382] " nobu
@ 2014-10-14 13:46 ` akr
  2014-10-15  9:03 ` [ruby-dev:48636] " duerst
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: akr @ 2014-10-14 13:46 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been updated by Akira Tanaka.


えぇと、ここでの string 自体は US-ASCII で valid なのです。
'\x80' というのは US-ASCII な 4文字の文字列なので。
CODERANGE_BROKEN な文字列ではありません。

それを regexp として解釈した時に US-ASCII としては invalid なことに気がついて現在は例外になりますが、
US-ASCII な文字列の中にエスケープされた 8bit なバイトを示す記述があったら、
ASCII-8BIT な regexp にしたほうが一貫しているんじゃないか、という話です。

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-49435

* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48636] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
                   ` (2 preceding siblings ...)
  2014-10-14 13:46 ` [ruby-dev:48631] " akr
@ 2014-10-15  9:03 ` duerst
  2014-10-15  9:06 ` [ruby-dev:48637] " akr
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: duerst @ 2014-10-15  9:03 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been updated by Martin Dürst.


UTF-8 や Windows-31J で試してみたところ、両方とも (/#{s}/ も /#{'\x80'}/ も) invalid multibyte escape となっています。なぜ US-ASCII の場合片方しかなってないのか分かりませんが、両方ともエラーになった方が筋が通るのではないかと思います。

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-49456

* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48637] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
                   ` (3 preceding siblings ...)
  2014-10-15  9:03 ` [ruby-dev:48636] " duerst
@ 2014-10-15  9:06 ` akr
  2014-10-16  4:12 ` [ruby-dev:48646] " duerst
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: akr @ 2014-10-15  9:06 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been updated by Akira Tanaka.


筋が通るというのは原則どおりなのでそれはそうですが、
US-ASCII の場合は例外扱いでそうはしないことにしたという経緯があるので
筋が通るということのみではそうする理由にはならないと思います。

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-49457

* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48646] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
                   ` (4 preceding siblings ...)
  2014-10-15  9:06 ` [ruby-dev:48637] " akr
@ 2014-10-16  4:12 ` duerst
  2014-10-17  0:52 ` [ruby-dev:48654] " akr
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: duerst @ 2014-10-16  4:12 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been updated by Martin Dürst.


US-ASCII で色々例外があることは分かっています。しかし、例外を増やすのではなく、減らす方向で考えた方がいいかと思います。US-ASCII のではなく、 UTF-8 がデフォールトソースエンコーディングとなった今では /#{'\x80'}/ などはソースのエンコーディングを考えなかったら通らなくなりました。そこで実際に US-ASCII のではなく、ASCII-8BIT を使いたかったら、その通りに -*- encoding: ASCII-8BIT と書けばいいかと思います。その意味で最近になって US-ASCII を特別扱いする理由が減っていると思います。

[もともとの原因は、Ruby でソースエンコーディング以外にエンコーディングで文字列リテラルが作れないことかと思います。その為に #10391 を提案しました。]

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-49480

* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48654] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
                   ` (5 preceding siblings ...)
  2014-10-16  4:12 ` [ruby-dev:48646] " duerst
@ 2014-10-17  0:52 ` akr
  2014-10-17  6:06 ` [ruby-dev:48657] [ruby-trunk - Bug #10382] [Closed] " nobu
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 10+ messages in thread
From: akr @ 2014-10-17  0:52 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been updated by Akira Tanaka.


デフォルトのソースエンコーディングが UTF-8 になったことはこっちも仕様を変更する理由になるかもしれませんね。

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-49503

* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48657] [ruby-trunk - Bug #10382] [Closed] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
                   ` (6 preceding siblings ...)
  2014-10-17  0:52 ` [ruby-dev:48654] " akr
@ 2014-10-17  6:06 ` nobu
  2014-10-17  8:21 ` [ruby-dev:48658] [ruby-trunk - Bug #10382] " akr
  2014-12-29  9:38 ` [ruby-dev:48793] " nobu
  9 siblings, 0 replies; 10+ messages in thread
From: nobu @ 2014-10-17  6:06 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been updated by Nobuyoshi Nakada.

Status changed from Open to Closed
% Done changed from 0 to 100

Applied in changeset r47992.

----------
re.c: mak eregexps with binary escapes ASCII-8BIT

* re.c (unescape_nonascii): make dynamically compiled US-ASCII
  regexps ASCII-8BIT encoding if binary (hexadecimal, control,
  meta) escapes are contained, as well as literal regexps.
  [ruby-dev:48626] [Bug #10382]

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-49508

* Author: Akira Tanaka
* Status: Closed
* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48658] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
                   ` (7 preceding siblings ...)
  2014-10-17  6:06 ` [ruby-dev:48657] [ruby-trunk - Bug #10382] [Closed] " nobu
@ 2014-10-17  8:21 ` akr
  2014-12-29  9:38 ` [ruby-dev:48793] " nobu
  9 siblings, 0 replies; 10+ messages in thread
From: akr @ 2014-10-17  8:21 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been updated by Akira Tanaka.


なかださんが(最初の報告における前者の挙動に)直してくれたようです。

後者の挙動にしたければ、それは仕様変更なので、別のチケットにするのが適切かと思います。

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-49510

* Author: Akira Tanaka
* Status: Closed
* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ruby-dev:48793] [ruby-trunk - Bug #10382] s = '\x80'; /#{s}/ raises an exception in US-ASCII script
       [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
                   ` (8 preceding siblings ...)
  2014-10-17  8:21 ` [ruby-dev:48658] [ruby-trunk - Bug #10382] " akr
@ 2014-12-29  9:38 ` nobu
  9 siblings, 0 replies; 10+ messages in thread
From: nobu @ 2014-12-29  9:38 UTC (permalink / raw
  To: ruby-dev

Issue #10382 has been updated by Nobuyoshi Nakada.

Related to Bug #10670: char-class matching same character with different encodings raises exception added

----------------------------------------
Bug #10382: s = '\x80'; /#{s}/ raises an exception in US-ASCII script
https://bugs.ruby-lang.org/issues/10382#change-50681

* Author: Akira Tanaka
* Status: Closed
* 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/

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-12-29  9:43 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <redmine.issue-10382.20141014114801@ruby-lang.org>
2014-10-14 11:48 ` [ruby-dev:48626] [ruby-trunk - Bug #10382] [Open] s = '\x80'; /#{s}/ raises an exception in US-ASCII script akr
2014-10-14 13:16 ` [ruby-dev:48630] [ruby-trunk - Bug #10382] " nobu
2014-10-14 13:46 ` [ruby-dev:48631] " akr
2014-10-15  9:03 ` [ruby-dev:48636] " duerst
2014-10-15  9:06 ` [ruby-dev:48637] " akr
2014-10-16  4:12 ` [ruby-dev:48646] " duerst
2014-10-17  0:52 ` [ruby-dev:48654] " akr
2014-10-17  6:06 ` [ruby-dev:48657] [ruby-trunk - Bug #10382] [Closed] " nobu
2014-10-17  8:21 ` [ruby-dev:48658] [ruby-trunk - Bug #10382] " akr
2014-12-29  9:38 ` [ruby-dev:48793] " nobu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).