From: "H.Yamamoto" Date: 2005-10-23T15:37:43+09:00 Subject: [ruby-dev:27482] Re: yaml and pp dump core 山本です。 >こんばんは、sheepman です。 >次のようにすると core を吐きます。 > >$ ruby -v >ruby 1.8.3 (2005-09-29) [i686-linux] > >$ ruby -e ' >require "yaml" >require "pp" >y = YAML.load <!tag:yaml.org,2002:str foo : >HERE >pp y C++Builder 付属の CodeGuard で調べたところ、メモリの二重開放が 生じているようでした。 Error 18182. 0x310030 (スレッド 0x0A04): 解放済みリソースへの参照: free(0x03120B78) 呼び出し履歴: 0x0358E40D(=syck.so:0x01:00D40D) ..\..\..\ruby\ext\syck\node.c#37 0x0358A4D7(=syck.so:0x01:0094D7) ..\..\..\ruby\ext\syck\handler.c#26 0x03588D5A(=syck.so:0x01:007D5A) gram.y#58 0x03598856(=syck.so:0x01:017856) ..\..\..\ruby\ext\syck\syck.c#494 0x035922D1(=syck.so:0x01:0112D1) ..\..\..\ruby\ext\syck\rubyext.c#804 0x02539EDE(=BCCWIN32-RUBY18.DLL:0x01:028EDE) ..\ruby\eval.c#5306 メモリブロック(0x03120B78) [長さ: 100 バイト] は malloc によって確保されました。 呼び出し履歴: 0x0359E348(=syck.so:0x01:01D348) token.re#831 0x03598B86(=syck.so:0x01:017B86) token.re#256 0x0358892D(=syck.so:0x01:00792D) gram.c#1115 0x03598856(=syck.so:0x01:017856) ..\..\..\ruby\ext\syck\syck.c#494 0x035922D1(=syck.so:0x01:0112D1) ..\..\..\ruby\ext\syck\rubyext.c#804 0x02539EDE(=BCCWIN32-RUBY18.DLL:0x01:028EDE) ..\ruby\eval.c#5306 メモリブロック (0x03120B78) は free によって解放されました。 呼び出し履歴: 0x0358A95F(=syck.so:0x01:00995F) ..\..\..\ruby\ext\syck\handler.c#144 0x03588DEC(=syck.so:0x01:007DEC) gram.y#77 0x03598856(=syck.so:0x01:017856) ..\..\..\ruby\ext\syck\syck.c#494 0x035922D1(=syck.so:0x01:0112D1) ..\..\..\ruby\ext\syck\rubyext.c#804 0x02539EDE(=BCCWIN32-RUBY18.DLL:0x01:028EDE) ..\ruby\eval.c#5306 0x0253ABC4(=BCCWIN32-RUBY18.DLL:0x01:029BC4) ..\ruby\eval.c#5439 syck_type_id_to_uri が新規メモリを返さない場合があるようなので、 とりあえずこうすると落ちなくなりました。 Index: handler.c =================================================================== --- handler.c (revision 1) +++ handler.c (working copy) @@ -141,6 +141,7 @@ } n->type_id = syck_type_id_to_uri( uri ); + ASSERT( n->type_id != uri ); S_FREE( uri ); } Index: implicit.c =================================================================== --- implicit.c (revision 1) +++ implicit.c (working copy) @@ -2481,7 +2481,7 @@ goto yy245; yy245: #line 174 "implicit.re" -{ return type_id; } +{ return syck_strndup( type_id, strlen( type_id ) ); } #line 2485 "" yy246: yych = *++YYCURSOR; switch(yych){ @@ -2928,7 +2928,7 @@ goto yy265; yy265: #line 172 "implicit.re" -{ return type_id; } +{ return syck_strndup( type_id, strlen( type_id ) ); } #line 2932 "" yy266: yych = *++YYCURSOR; switch(yych){ ただ、sheepman さんの再現コードが、たまたま落ちなかった bcc32 版だと E:\>ruby -v ruby 1.8.3 (2005-09-21) [i386-bccwin32] E:\>ruby \z.rb #nil}> だったのに、このパッチを当てると E:/ruby-cvs/ruby_1_8/lib/yaml/rubytypes.rb:154:in `initialize': can't convert ni l into String (TypeError) from E:/ruby-cvs/ruby_1_8/lib/yaml/rubytypes.rb:154:in `yaml_new' from E:/ruby-cvs/ruby_1_8/lib/yaml.rb:133:in `load' from /z.rb:3 となってしまうのが???です。