[ruby-dev:36750] [Bug #650] Marshal.load raises RegexpError

View: New views
20 Messages — Rating Filter:   Alert me  
< Prev | 1 - 2 | Next >

[ruby-dev:36750] [Bug #650] Marshal.load raises RegexpError

by James Gray-8 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Bug #650: Marshal.load raises RegexpError
http://redmine.ruby-lang.org/issues/show/650

起票者: Shyouhei Urabe
ステータス: Open, 優先度: Normal
カテゴリ: M17N

以下のように、以前のバージョンのRubyで正しくdumpしたはずの文字列をtrunkでloadできません。

 % ruby1.8 -e 'Marshal.dump(/C:\Documents and Settings\urabe/, STDOUT)' | ruby1.8 -ve 'p Marshal.load(STDIN)'
 ruby 1.8.7 (2008-10-11 revision 17572) [x86_64-linux]
 /C:\Documents and Settings\urabe/

 % ruby1.8 -e 'Marshal.dump(/C:\Documents and Settings\urabe/, STDOUT)' | ruby1.9 -ve 'p Marshal.load(STDIN)'
 ruby 1.9.0 (2008-10-13  revision 17576) [x86_64-linux]
 -e:1:in `load': invalid Unicode escape: /C:\Documents and Settings\urabe/ (RegexpError)
         from -e:1:in `<main>'


----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:36769] Re: [Bug #650] Marshal.load raises RegexpError

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:36750] [Bug #650] Marshal.load raises RegexpError"
    on Wed, 15 Oct 2008 22:59:59 +0900, Shyouhei Urabe <redmine@...> writes:

|以下のように、以前のバージョンのRubyで正しくdumpしたはずの文字列をtrunkでloadできません。
|
| % ruby1.8 -e 'Marshal.dump(/C:\Documents and Settings\urabe/, STDOUT)' | ruby1.8 -ve 'p Marshal.load(STDIN)'
| ruby 1.8.7 (2008-10-11 revision 17572) [x86_64-linux]
| /C:\Documents and Settings\urabe/

1.9では正規表現に\uが増えたからですね。

厳密に言うとmarshalに上位互換性がないのでmarshalのメジャーバー
ジョンを変化させるべきなのかもしれませんが、メリットよりもデ
メリットの方が大きいのでそれはしない方向を考えてます。

で、1.8の方のregexpに手を入れて「\u」は「u」に正規化しようと
思います。そうすると、上のだと

  C:\Documents and Settingsurabe

になってしまうわけですが、もともと\Dは[0-9]という意味で、上の
正規表現はもともとパスにはマッチしないんで、これはこういうも
のだと思ってください。バックスラッシュを含むパターンはちゃん
と\\に変換してくださいということで。

                                まつもと ゆきひろ /:|)


[ruby-dev:36771] Re: [Bug #650] Marshal.load raises RegexpError

by Urabe Shyouhei-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

卜部です。

Yukihiro Matsumoto さんは書きました:
> 1.9では正規表現に\uが増えたからですね。
>
> 厳密に言うとmarshalに上位互換性がないのでmarshalのメジャーバー
> ジョンを変化させるべきなのかもしれませんが、メリットよりもデ
> メリットの方が大きいのでそれはしない方向を考えてます。
>  

ちなみにどういうデメリットですか?

> で、1.8の方のregexpに手を入れて「\u」は「u」に正規化しようと
> 思います。そうすると、上のだと
>
>   C:\Documents and Settingsurabe
>
> になってしまうわけですが、もともと\Dは[0-9]という意味で、上の
> 正規表現はもともとパスにはマッチしないんで、これはこういうも
> のだと思ってください。バックスラッシュを含むパターンはちゃん
> と\\に変換してくださいということで。

今後Marshal.loadされる場合に関しては特に問題が思い浮かばないのでいいん
じゃないかと思いますが、すでに作ってしまったPStoreデータベースが困りま
す、というか、手元で読めなくて若干困っているわけです。なにか(スクリプト
側ででもかまわないので)既存のMarshal済みデータに対するworkaroundみたいな
ものはないでしょうか。


[ruby-dev:36772] Re: [Bug #650] Marshal.load raises RegexpError

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:36771] Re: [Bug #650] Marshal.load raises RegexpError"
    on Sat, 18 Oct 2008 01:05:25 +0900, Urabe Shyouhei <shyouhei@...> writes:

|> 厳密に言うとmarshalに上位互換性がないのでmarshalのメジャーバー
|> ジョンを変化させるべきなのかもしれませんが、メリットよりもデ
|> メリットの方が大きいのでそれはしない方向を考えてます。

|ちなみにどういうデメリットですか?

1.8と1.9でmarshalデータが全くやりとりできないというデメリッ
トです。

|今後Marshal.loadされる場合に関しては特に問題が思い浮かばないのでいいん
|じゃないかと思いますが、

実はMarshal.dumpしたものをloadしても等しくないという問題がな
いわけではないんですが。

|すでに作ってしまったPStoreデータベースが困りま
|す、というか、手元で読めなくて若干困っているわけです。なにか(スクリプト
|側ででもかまわないので)既存のMarshal済みデータに対するworkaroundみたいな
|ものはないでしょうか。

これからコミットする新しい1.8で古いmarshalデータを一度読み込
んで、ふたたび書き込むことで1.9でも読めるようにできます。って、
そういうことじゃないのかな。


[ruby-dev:36773] Re: [Bug #650] Marshal.load raises RegexpError

by Urabe Shyouhei-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

卜部です。

Yukihiro Matsumoto さんは書きました:

> まつもと ゆきひろです
>
> In message "Re: [ruby-dev:36771] Re: [Bug #650] Marshal.load raises RegexpError"
>     on Sat, 18 Oct 2008 01:05:25 +0900, Urabe Shyouhei <shyouhei@...> writes:
>
> |> 厳密に言うとmarshalに上位互換性がないのでmarshalのメジャーバー
> |> ジョンを変化させるべきなのかもしれませんが、メリットよりもデ
> |> メリットの方が大きいのでそれはしない方向を考えてます。
>
> |ちなみにどういうデメリットですか?
>
> 1.8と1.9でmarshalデータが全くやりとりできないというデメリッ
> トです。
>  

まったくということはないでしょう。
1.8で作ったデータを1.9が読めように1.9を作るのは可能なはずです。
# 今でも、古いmarshal formatのデータを読もうとすると、警告が出るが処理自
体はできるはず。

> |すでに作ってしまったPStoreデータベースが困りま
> |す、というか、手元で読めなくて若干困っているわけです。なにか(スクリプト
> |側ででもかまわないので)既存のMarshal済みデータに対するworkaroundみたいな
> |ものはないでしょうか。
>
> これからコミットする新しい1.8で古いmarshalデータを一度読み込
> んで、ふたたび書き込むことで1.9でも読めるようにできます。って、
> そういうことじゃないのかな。
>  

気づいたんですけど、それだと

% ruby1.9 -e 'Marshal.dump(/\u0001/, STDOUT)' | \
  ruby1.8 -e 'Marshal.dump(Marshal.load(STDIN), STDOUT)' | \
  ruby1.9 -e 'p Marshal.load(STDIN)'

とかがroud-tripしなくなると思う(いまはする)んですけど、平気なんですかね。


[ruby-dev:36775] Re: [Bug #650] Marshal.load raises RegexpError

by Tanaka Akira-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

In article <48F90C3D.80609@...>,
  Urabe Shyouhei <shyouhei@...> writes:

> 気づいたんですけど、それだと
>
> % ruby1.9 -e 'Marshal.dump(/\u0001/, STDOUT)' | \
>   ruby1.8 -e 'Marshal.dump(Marshal.load(STDIN), STDOUT)' | \
>   ruby1.9 -e 'p Marshal.load(STDIN)'
>
> とかがroud-tripしなくなると思う(いまはする)んですけど、平気なんですかね。

syntax と semantics のどちらを保存するかというと、semantics
のほうがいいんじゃないですかね。

今は以下のように、マッチするものが変化するわけで、それが変化
しないようになるほうがまだマシなんじゃないでしょうか。

% ruby-1.8 -e 'print Marshal.dump(/\u0001/)' > z
% ruby-1.8 -e 'r = Marshal.load(STDIN); p ["\x01", "u0001"].map {|s| r =~ s }' < z    
[nil, 0]
% ruby-1.9 -e 'r = Marshal.load(STDIN); p ["\x01", "u0001"].map {|s| r =~ s }' < z
[0, nil]
--
[田中 哲][たなか あきら][Tanaka Akira]


[ruby-dev:36776] Re: [Bug #650] Marshal.load raises RegexpError

by Urabe Shyouhei-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

卜部です。

Tanaka Akira さんは書きました:
> syntax と semantics のどちらを保存するかというと、semantics
> のほうがいいんじゃないですかね。
>
> 今は以下のように、マッチするものが変化するわけで、それが変化
> しないようになるほうがまだマシなんじゃないでしょうか。
>  

semanticsのほうが保存されてたほうがいいのには納得しましたが、寝不足の頭
で考えたところによると、それって無理じゃない?

1.8と1.9は正規表現エンジンが違うわけで、たとえば /(?<foo>bar)/ とかは1.8
に持っていくことはできませんよね。

まあつまり、結局のところMarshalデータを1.8で作って1.9で読むのはひょっと
して頑張れば可能かもしれないけど、1.9で作って1.8で読むのはあからさまに不
可能なので、頑張れるにしても上位互換くらいが関の山で、ってことはMarshal
のバージョンが同じであることに固執しても意味ないんじゃないかという気がし
てきたんですが、どうでしょう。


[ruby-dev:36777] Re: [Bug #650] Marshal.load raises RegexpError

by Tanaka Akira-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

In article <48F986BF.8020304@...>,
  Urabe Shyouhei <shyouhei@...> writes:

> semanticsのほうが保存されてたほうがいいのには納得しましたが、寝不足の頭
> で考えたところによると、それって無理じゃない?
>
> 1.8と1.9は正規表現エンジンが違うわけで、たとえば /(?<foo>bar)/ とかは1.8
> に持っていくことはできませんよね。

えぇ。無理なことはあります。

> まあつまり、結局のところMarshalデータを1.8で作って1.9で読むのはひょっと
> して頑張れば可能かもしれないけど、1.9で作って1.8で読むのはあからさまに不
> 可能なので、頑張れるにしても上位互換くらいが関の山で、ってことはMarshal
> のバージョンが同じであることに固執しても意味ないんじゃないかという気がし
> てきたんですが、どうでしょう。

バージョンをあげると drb は 1.8, 1.9 間で動かなくなっちゃいますけどねぇ。
--
[田中 哲][たなか あきら][Tanaka Akira]


[ruby-dev:36784] Re: [Bug #650] Marshal.load raises RegexpError

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:36773] Re: [Bug #650] Marshal.load raises RegexpError"
    on Sat, 18 Oct 2008 07:05:07 +0900, Urabe Shyouhei <shyouhei@...> writes:

|> |> 厳密に言うとmarshalに上位互換性がないのでmarshalのメジャーバー
|> |> ジョンを変化させるべきなのかもしれませんが、メリットよりもデ
|> |> メリットの方が大きいのでそれはしない方向を考えてます。
|>
|> |ちなみにどういうデメリットですか?
|>
|> 1.8と1.9でmarshalデータが全くやりとりできないというデメリッ
|> トです。
|
|まったくということはないでしょう。
|1.8で作ったデータを1.9が読めように1.9を作るのは可能なはずです。
|# 今でも、古いmarshal formatのデータを読もうとすると、警告が出るが処理自
|体はできるはず。

Marshalファイルフォーマットには、メジャーバージョンとマイナー
バージョンの情報が付加されており、マイナーバージョンの違いは
「上位互換性がある」ので「古いmarshal formatのデータを読もう
とすると、警告が出るが処理自体はできる」、メジャーバージョン
の違いは「互換性はないので古いデータは読めない」とする仕組み
があります。

今回の場合は、古いデータが新しいMarshalで読めない(Marshal以
外の部分の変更に影響を受けた)というものなので、Marshal側でで
きる対応は

 (1) 杓子定規に考えて、メジャーバージョンをあげる(1.8と1.9が
     通信できなくなる、うれしくない)

 (2) ささいな違いなので気にしない

 (3) 1.8で正規化する(すでに書き込んだデータは救済できないし、
     副作用もある)

 (4) 1.9側に1.8正規表現かどうか判別して1.9正規表現に変換する
     (おそらくは巨大な)ルーチンを追加する(苦労の割に得るもの
     が少ない、うれしくない)

くらいではないかと思います。現状のリソースから考えると、2か3
くらいがせいぜいではないかと思います。

                                まつもと ゆきひろ /:|)


[ruby-dev:36785] Re: [Bug #650] Marshal.load raises RegexpError

by Urabe Shyouhei-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

卜部です。

Yukihiro Matsumoto さんは書きました:

>  (1) 杓子定規に考えて、メジャーバージョンをあげる(1.8と1.9が
>      通信できなくなる、うれしくない)
>
>  (2) ささいな違いなので気にしない
>
>  (3) 1.8で正規化する(すでに書き込んだデータは救済できないし、
>      副作用もある)
>
>  (4) 1.9側に1.8正規表現かどうか判別して1.9正規表現に変換する
>      (おそらくは巨大な)ルーチンを追加する(苦労の割に得るもの
>      が少ない、うれしくない)
>  

(5) 1.9でRegexp#_dumpとRegexp#_loadを定義する
ってのはどうでしょうね。すると
* TYPE_REGEXPなデータは1.8のRegexp
* TYPE_USERDEFなデータ(でklass==rb_cRegexp)は1.9のRegexp
という割と簡単な判定でいけそうな気がするんですが。


# おもいつきレベルだけど。


[ruby-dev:36793] Re: [Bug #650] Marshal.load raises RegexpError

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:36785] Re: [Bug #650] Marshal.load raises RegexpError"
    on Sun, 19 Oct 2008 02:13:16 +0900, Urabe Shyouhei <shyouhei@...> writes:

|Yukihiro Matsumoto さんは書きました:
|>  (1) 杓子定規に考えて、メジャーバージョンをあげる(1.8と1.9が
|>      通信できなくなる、うれしくない)
|>
|>  (2) ささいな違いなので気にしない
|>
|>  (3) 1.8で正規化する(すでに書き込んだデータは救済できないし、
|>      副作用もある)
|>
|>  (4) 1.9側に1.8正規表現かどうか判別して1.9正規表現に変換する
|>      (おそらくは巨大な)ルーチンを追加する(苦労の割に得るもの
|>      が少ない、うれしくない)
|
|(5) 1.9でRegexp#_dumpとRegexp#_loadを定義する
|ってのはどうでしょうね。すると
|* TYPE_REGEXPなデータは1.8のRegexp
|* TYPE_USERDEFなデータ(でklass==rb_cRegexp)は1.9のRegexp
|という割と簡単な判定でいけそうな気がするんですが。

判別はできますが、その後の対応はどうするんでしょうね。
1.9に1.8のregex.cを導入するのも、1.8に鬼車を導入するのも現実
的ではないと思いますから、判別できても完全な互換性を維持する
のは困難ではないでしょうか。

さらに言うと、この件についてなんらかの対応したとしても、救済
できるのは、ドキュメントに掲載されていないし、サポートされて
いると明言されたこともない\uのようなメタキャラクタでないアル
ファベットの前にバックスラッシュがついた正規表現だけなので、
コストの割に得るものが少ない気がします。

考えるほど、ここは(2)かなあ、という気がしてきました。という
か、むしろundocumentedなので対応すべきでないような。

                                まつもと ゆきひろ /:|)


[ruby-dev:36794] Re: [Bug #650] Marshal.load raises RegexpError

by Urabe Shyouhei-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Yukihiro Matsumoto さんは書きました:

> まつもと ゆきひろです
>
> In message "Re: [ruby-dev:36785] Re: [Bug #650] Marshal.load raises RegexpError"
>     on Sun, 19 Oct 2008 02:13:16 +0900, Urabe Shyouhei <shyouhei@...> writes:
>
> |Yukihiro Matsumoto さんは書きました:
> |>  (1) 杓子定規に考えて、メジャーバージョンをあげる(1.8と1.9が
> |>      通信できなくなる、うれしくない)
> |>
> |>  (2) ささいな違いなので気にしない
> |>
> |>  (3) 1.8で正規化する(すでに書き込んだデータは救済できないし、
> |>      副作用もある)
> |>
> |>  (4) 1.9側に1.8正規表現かどうか判別して1.9正規表現に変換する
> |>      (おそらくは巨大な)ルーチンを追加する(苦労の割に得るもの
> |>      が少ない、うれしくない)
> |
> |(5) 1.9でRegexp#_dumpとRegexp#_loadを定義する
> |ってのはどうでしょうね。すると
> |* TYPE_REGEXPなデータは1.8のRegexp
> |* TYPE_USERDEFなデータ(でklass==rb_cRegexp)は1.9のRegexp
> |という割と簡単な判定でいけそうな気がするんですが。
>
> 判別はできますが、その後の対応はどうするんでしょうね。
> 1.9に1.8のregex.cを導入するのも、1.8に鬼車を導入するのも現実
> 的ではないと思いますから、判別できても完全な互換性を維持する
> のは困難ではないでしょうか。
>  

「1.8から来た正規表現に\uが含まれていたら1.9ではuのこととして扱う」でい
いんじゃないですかね。
1.8が1.9から来る正規表現を読めるようになることは期待してません。

> さらに言うと、この件についてなんらかの対応したとしても、救済
> できるのは、ドキュメントに掲載されていないし、サポートされて
> いると明言されたこともない\uのようなメタキャラクタでないアル
> ファベットの前にバックスラッシュがついた正規表現だけなので、
> コストの割に得るものが少ない気がします。
>
> 考えるほど、ここは(2)かなあ、という気がしてきました。という
> か、むしろundocumentedなので対応すべきでないような。
>  

undocumentedなのが理由になれるのはちゃんとドキュメントがあるときだけでに
しましょうね。
たとえば/\n/や/\t/あたりもドキュメントされてませんけど、まさか今後の動作
を保証しないとか言い出しますか?

ところでなんでこんなにしつこく対応すべきと主張しているかというと、今後同
様のことがまだ起こると思うからです。
どうせ1.9は1.8と互換性がないわけで、Marshalで非互換が見つかったり、あら
たに作られたりすることは今後も出てくることが強く予想されます。そのとき
に、毎回同様の判断を求められるでしょう。それを毎回「気にしない」とかいう
逃げかたをしていくと、どんどんMarshalでやりとりできる情報が少なくなって
いって用をなさなくなります。しかもPStoreの場合だと中のオブジェクトが一個
でも読めなくなると、DB全体を捨てないといけません。これはとても困ります。
今後「気にしない」をどんどん続けていくと、最終的には読めないDBしか残らな
くなるでしょう(さすがにそこまで到達する前になんか回避策は考えることにな
ると思いますが)。

せめて過去のバージョンで読めていたデータは取り出せるべきです。


[ruby-dev:36795] Re: [Bug #650] Marshal.load raises RegexpError

by NARUSE, Yui-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

成瀬です。

On Sun, 19 Oct 2008 02:13:16 +0900, Urabe Shyouhei  
<shyouhei@...> wrote:

> 卜部です。
>
> Yukihiro Matsumoto さんは書きました:
>>  (1) 杓子定規に考えて、メジャーバージョンをあげる(1.8と1.9が
>>      通信できなくなる、うれしくない)
>>
>>  (2) ささいな違いなので気にしない
>>
>>  (3) 1.8で正規化する(すでに書き込んだデータは救済できないし、
>>      副作用もある)
>>
>>  (4) 1.9側に1.8正規表現かどうか判別して1.9正規表現に変換する
>>      (おそらくは巨大な)ルーチンを追加する(苦労の割に得るもの
>>      が少ない、うれしくない)
>>
>
> (5) 1.9でRegexp#_dumpとRegexp#_loadを定義する
> ってのはどうでしょうね。すると
> * TYPE_REGEXPなデータは1.8のRegexp
> * TYPE_USERDEFなデータ(でklass==rb_cRegexp)は1.9のRegexp
> という割と簡単な判定でいけそうな気がするんですが。
>
>
> # おもいつきレベルだけど。

そこまでしなくても、encoding の有無で判別できるような気がするんですが、
わたしの理解が間違っているのかなぁ。

--
NARUSE, Yui  <naruse@...>


[ruby-dev:36823] Re: [Bug #650] Marshal.load raises RegexpError

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:36794] Re: [Bug #650] Marshal.load raises RegexpError"
    on Mon, 20 Oct 2008 01:50:06 +0900, Urabe Shyouhei <shyouhei@...> writes:

|「1.8から来た正規表現に\uが含まれていたら1.9ではuのこととして扱う」でい
|いんじゃないですかね。
|1.8が1.9から来る正規表現を読めるようになることは期待してません。

|undocumentedなのが理由になれるのはちゃんとドキュメントがあるときだけでに
|しましょうね。
|たとえば/\n/や/\t/あたりもドキュメントされてませんけど、まさか今後の動作
|を保証しないとか言い出しますか?

あー、では「意味」と「意図」と言い換えましょう。\nや\tがどの
ような意味を持つかについて、ほとんどの人は一定の期待を持つで
しょうし、それに応えるつもりは十分にあります。しかし、一方、
\uはどうでしょう? これにたいしてほとんどの人が合意できる意味
は存在しないと思います。元の正規表現を書いた人がどのような期
待をしたのかはわかりませんが、すくなくとも卜部さんがあげてく
ださった例では、「期待してるであろう動作(バックスラッシュ+u)」
と「実際の動作(u)」は異なっていました。要するに元のプログラム
のバグです。

このような「間違った使い方しか存在しない表現」は積極的にサポー
トしない方がよいのではないかと思います。

|ところでなんでこんなにしつこく対応すべきと主張しているかというと、今後同
|様のことがまだ起こると思うからです。
|どうせ1.9は1.8と互換性がないわけで、Marshalで非互換が見つかったり、あら
|たに作られたりすることは今後も出てくることが強く予想されます。そのとき
|に、毎回同様の判断を求められるでしょう。それを毎回「気にしない」とかいう
|逃げかたをしていくと、どんどんMarshalでやりとりできる情報が少なくなって
|いって用をなさなくなります。しかもPStoreの場合だと中のオブジェクトが一個
|でも読めなくなると、DB全体を捨てないといけません。これはとても困ります。
|今後「気にしない」をどんどん続けていくと、最終的には読めないDBしか残らな
|くなるでしょう(さすがにそこまで到達する前になんか回避策は考えることにな
|ると思いますが)。
|
|せめて過去のバージョンで読めていたデータは取り出せるべきです。

無条件で? 今回の場合はバージョンが進んだおかげでバグが見つ
かったのだと私には見えますけど。

                                まつもと ゆきひろ /:|)


[ruby-dev:36830] Re: [Bug #650] Marshal.load raises RegexpError

by Urabe Shyouhei-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

もとの正規表現にバグがあるのは認めますが、それに巻き込まれてでかいPStore
のデータがまるごと読めなくて困ってるんですってば。

じゃあ妥協案ですけど、Marshal.loadに invalid: :replace とか受け取れるよ
うにしません?

Yukihiro Matsumoto さんは書きました:

> まつもと ゆきひろです
>
> In message "Re: [ruby-dev:36794] Re: [Bug #650] Marshal.load raises RegexpError"
>     on Mon, 20 Oct 2008 01:50:06 +0900, Urabe Shyouhei <shyouhei@...> writes:
>
> |「1.8から来た正規表現に\uが含まれていたら1.9ではuのこととして扱う」でい
> |いんじゃないですかね。
> |1.8が1.9から来る正規表現を読めるようになることは期待してません。
>
> |undocumentedなのが理由になれるのはちゃんとドキュメントがあるときだけでに
> |しましょうね。
> |たとえば/\n/や/\t/あたりもドキュメントされてませんけど、まさか今後の動作
> |を保証しないとか言い出しますか?
>
> あー、では「意味」と「意図」と言い換えましょう。\nや\tがどの
> ような意味を持つかについて、ほとんどの人は一定の期待を持つで
> しょうし、それに応えるつもりは十分にあります。しかし、一方、
> \uはどうでしょう? これにたいしてほとんどの人が合意できる意味
> は存在しないと思います。元の正規表現を書いた人がどのような期
> 待をしたのかはわかりませんが、すくなくとも卜部さんがあげてく
> ださった例では、「期待してるであろう動作(バックスラッシュ+u)」
> と「実際の動作(u)」は異なっていました。要するに元のプログラム
> のバグです。
>
> このような「間違った使い方しか存在しない表現」は積極的にサポー
> トしない方がよいのではないかと思います。
>
> |ところでなんでこんなにしつこく対応すべきと主張しているかというと、今後同
> |様のことがまだ起こると思うからです。
> |どうせ1.9は1.8と互換性がないわけで、Marshalで非互換が見つかったり、あら
> |たに作られたりすることは今後も出てくることが強く予想されます。そのとき
> |に、毎回同様の判断を求められるでしょう。それを毎回「気にしない」とかいう
> |逃げかたをしていくと、どんどんMarshalでやりとりできる情報が少なくなって
> |いって用をなさなくなります。しかもPStoreの場合だと中のオブジェクトが一個
> |でも読めなくなると、DB全体を捨てないといけません。これはとても困ります。
> |今後「気にしない」をどんどん続けていくと、最終的には読めないDBしか残らな
> |くなるでしょう(さすがにそこまで到達する前になんか回避策は考えることにな
> |ると思いますが)。
> |
> |せめて過去のバージョンで読めていたデータは取り出せるべきです。
>
> 無条件で? 今回の場合はバージョンが進んだおかげでバグが見つ
> かったのだと私には見えますけど。
>
>                                 まつもと ゆきひろ /:|)
>
>
>
>  



[ruby-dev:36833] Re: [Bug #650] Marshal.load raises RegexpError

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:36830] Re: [Bug #650] Marshal.load raises RegexpError"
    on Tue, 21 Oct 2008 12:37:17 +0900, Urabe Shyouhei <shyouhei@...> writes:

|もとの正規表現にバグがあるのは認めますが、それに巻き込まれてでかいPStore
|のデータがまるごと読めなくて困ってるんですってば。

別に意地悪を言ってるわけではないんですが。
loadに渡すprocが使えるか、と一瞬思ったのですが、これは再生し
たオブジェクトを引数にするので再生そのものが失敗する今回のケー
スは使えませんねえ。

|じゃあ妥協案ですけど、Marshal.loadに invalid: :replace とか受け取れるよ
|うにしません?

基本的にはいいアイディアだと思います。この場合、APIは

  Marshal.load(src, invalid: :replace)

とかにするんですかね。その場合、再生に失敗したオブジェクトは
なにに置換したらよいのでしょうか。nil?

                                まつもと ゆきひろ /:|)


[ruby-dev:36836] Re: [Bug #650] Marshal.load raises RegexpError

by Urabe Shyouhei-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

卜部です。

Yukihiro Matsumoto さんは書きました:

> |じゃあ妥協案ですけど、Marshal.loadに invalid: :replace とか受け取れるよ
> |うにしません?
>
> 基本的にはいいアイディアだと思います。この場合、APIは
>
>   Marshal.load(src, invalid: :replace)
>
> とかにするんですかね。その場合、再生に失敗したオブジェクトは
> なにに置換したらよいのでしょうか。nil?
>  

ユーザーアプリケーション側は変換に失敗したかどうかを==で判定するとおもわ
れるので、nilみたいなものよりも普通のObject.newのほうがいいんじゃないで
しょうか。

  # rb_define_const(rb_mMarshal, "Invalid", rb_obj_alloc(rb_cObject);
  obj = Marshal.load src, invalid: :replace
  obj == Marshal::Invalid and raise "invalid data"


ObjectのインスタンスをMarshal.load(Marshal.dump)したものはもとのインスタ
ンスとは==にならないからこれで問題ないとおもいます。


[ruby-dev:36842] Re: [Bug #650] Marshal.load raises RegexpError

by Kazuhiro NISHIYAMA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

西山和広です。

At Tue, 21 Oct 2008 16:30:57 +0900,
Urabe Shyouhei wrote:

>
> ユーザーアプリケーション側は変換に失敗したかどうかを==で判定するとおもわ
> れるので、nilみたいなものよりも普通のObject.newのほうがいいんじゃないで
> しょうか。
>
>   # rb_define_const(rb_mMarshal, "Invalid", rb_obj_alloc(rb_cObject);
>   obj = Marshal.load src, invalid: :replace
>   obj == Marshal::Invalid and raise "invalid data"
>
>
> ObjectのインスタンスをMarshal.load(Marshal.dump)したものはもとのインスタ
> ンスとは==にならないからこれで問題ないとおもいます。

drubyの場合はMarshal.loadに失敗したときに、例外と元のデータを持った
DRbUnknownオブジェクトになるので、同じように理由と読み込めなかったデータを
持つオブジェクトにするのはどうでしょうか?


--
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)


[ruby-dev:36863] Re: [Bug #650] Marshal.load raises RegexpError

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:36836] Re: [Bug #650] Marshal.load raises RegexpError"
    on Tue, 21 Oct 2008 16:30:57 +0900, Urabe Shyouhei <shyouhei@...> writes:

|ユーザーアプリケーション側は変換に失敗したかどうかを==で判定するとおもわ
|れるので、nilみたいなものよりも普通のObject.newのほうがいいんじゃないで
|しょうか。
|
|  # rb_define_const(rb_mMarshal, "Invalid", rb_obj_alloc(rb_cObject);
|  obj = Marshal.load src, invalid: :replace
|  obj == Marshal::Invalid and raise "invalid data"
|
|ObjectのインスタンスをMarshal.load(Marshal.dump)したものはもとのインスタ
|ンスとは==にならないからこれで問題ないとおもいます。

ふむ。この線で対応しようかなと思うのですが、まだもう少しつめ
きれていない気がします。以下にいろいろと考えを書き連ねておき
ますので、意見があれば聞かせてください。

  * オブジェクト再生時に例外が発生したらObject.newに置き換え
    る挙動はデフォルトか?
  * 切り替え可能か(いつも置き換えてはいけないか)
  * Object.newにはどのような情報を持たすべきか
    * 特定のマーカーになるオブジェクト(使いまわす)
    * 単にObject.new
    * 特定のクラス(or Struct)のインスタンス
      * 例外や失敗した復元情報を含む?

いろいろ難しいものだ。

                                まつもと ゆきひろ /:|)


[ruby-dev:36864] Re: [Bug #650] Marshal.load raises RegexpError

by Keiju ISHITSUKA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

けいじゅ@いしつかです.

In [ruby-dev :36863 ] the message: "[ruby-dev:36863] Re: [Bug #650]
Marshal.load raises RegexpError ", on Oct/22 17:37(JST) Yukihiro
Matsumoto writes:

>まつもと ゆきひろです

>ふむ。この線で対応しようかなと思うのですが、まだもう少しつめ
>きれていない気がします。以下にいろいろと考えを書き連ねておき
>ますので、意見があれば聞かせてください。

私は西山さんの:

>drubyの場合はMarshal.loadに失敗したときに、例外と元のデータを持った
>DRbUnknownオブジェクトになるので、同じように理由と読み込めなかったデータを
>持つオブジェクトにするのはどうでしょうか?

の方が良い気がします.

例えば, 配列の一要素が復元できなかった場合など, 複数のオブジェクトを再
生したとき,

>>   obj = Marshal.load src, invalid: :replace
>>   obj == Marshal::Invalid and raise "invalid data"

このやり方では, 実際にどのオブジェクトの再生に失敗したのか調べるのが難
しいと思います. まず例外を発生させて, 再生できなかったことを明示的に知
らせて, ではどこがおかしいのかな? って中身を調べられる方がよいのでは?

あと, この方法だと, オプションの指定も必要ないような気がします. 常にマー
カーに置き換えちゃえば良いので.


__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju@... <<---

< Prev | 1 - 2 | Next >