From: Bohuslav Kabrda Date: 2012-01-13T17:32:45+09:00 Subject: [ruby-core:42107] [ruby-trunk - Bug #5888] JSON unittest fails Issue #5888 has been updated by Bohuslav Kabrda. The flaw seems to be in ext/json/parser/parser.c - I compiled only this one with -O0 and the others with -O2 and everything worked fine. When I compile everything with -O2 and use valgrind --track-origins=yes -v --read-var-info=yes ruby -rjson -v -e "puts JSON.parse '[\"\u0000\"]'" Part of the valgrind output is quite suspicious: ==3350== Conditional jump or move depends on uninitialised value(s) ==3350== at 0x4EAB4F5: rb_io_puts (io.c:6223) ==3350== by 0x4EAB6AE: io_puts_ary (io.c:6174) ==3350== by 0x4F853EF: exec_recursive_i (thread.c:3940) ==3350== by 0x4F85A43: exec_recursive (thread.c:3991) ==3350== by 0x4EAB42C: rb_io_puts (io.c:6217) ==3350== by 0x4F787C1: vm_call0 (vm_eval.c:79) ==3350== by 0x4F7BFC2: vm_call_method (vm_insnhelper.c:404) ==3350== by 0x4F72191: vm_exec_core (insns.def:1015) ==3350== by 0x4F777B7: vm_exec (vm.c:1220) ==3350== by 0x4F7E7ED: rb_iseq_eval_main (vm.c:1461) ==3350== by 0x4E89E79: ruby_exec_internal (eval.c:204) ==3350== by 0x4E8A92C: ruby_exec_node (eval.c:251) ==3350== Uninitialised value was created by a stack allocation ==3350== at 0xD3E1430: JSON_parse_string (parser.rl:497) ==3350== ==3350== Syscall param write(buf) points to uninitialised byte(s) ==3350== at 0x524E00D: ??? (in /lib64/libpthread-2.15.so) ==3350== by 0x4EA43B3: io_flush_buffer_sync (io.c:640) ==3350== by 0x4EA9D15: rb_io_fptr_cleanup (io.c:3490) ==3350== by 0x4EABCB0: rb_io_fptr_finalize (io.c:3579) ==3350== by 0x4E99939: finalize_list (gc.c:2944) ==3350== by 0x4E9D301: rb_gc_call_finalizer_at_exit (gc.c:3075) ==3350== by 0x4E8C15A: ruby_cleanup (eval.c:147) ==3350== by 0x4E8C33E: ruby_run_node (eval.c:244) ==3350== by 0x40086A: main (main.c:38) ==3350== Address 0xd3039b0 is 0 bytes inside a block of size 8,192 alloc'd ==3350== at 0x4C284CD: malloc (vg_replace_malloc.c:236) ==3350== by 0x4E9C454: vm_xmalloc (gc.c:764) ==3350== by 0x4EAA3F0: io_binwrite (io.c:839) ==3350== by 0x4EAA67D: io_write (io.c:945) ==3350== by 0x4F787C1: vm_call0 (vm_eval.c:79) ==3350== by 0x4F7905F: rb_funcall (vm_eval.c:235) ==3350== by 0x4EAB475: rb_io_puts (io.c:6222) ==3350== by 0x4EAB6AE: io_puts_ary (io.c:6174) ==3350== by 0x4F853EF: exec_recursive_i (thread.c:3940) ==3350== by 0x4F85A43: exec_recursive (thread.c:3991) ==3350== by 0x4EAB42C: rb_io_puts (io.c:6217) ==3350== by 0x4F787C1: vm_call0 (vm_eval.c:79) ==3350== Uninitialised value was created by a stack allocation ==3350== at 0xD3E1430: JSON_parse_string (parser.rl:497) Mainly the last uninitialized value it particularly interesting, yet I'm not sure what exactly is causing the problem. ---------------------------------------- Bug #5888: JSON unittest fails https://bugs.ruby-lang.org/issues/5888 Author: Vit Ondruch Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 1.9.3p0 (2011-10-30) [x86_64-linux] Hello, When building Ruby 1.9.3 (as well as 2.0.0), the make check spits following errors: 1) Failure: test_parse_values(TC_JSON) [/builddir/build/BUILD/ruby-1.9.3-p0/test/json/test_json.rb:174]: <["\"\b\n\r\t\u0000\u001F"]> expected but was <["\"\b\n\r\t\xA8\xA8"]>. 2) Failure: test_parser_reset(TC_JSON) [/builddir/build/BUILD/ruby-1.9.3-p0/test/json/test_json.rb:291]: <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\u0000\u001F", "h"=>1000.0, "i"=>0.001}> expected but was <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\xA0\xA0", "h"=>1000.0, "i"=>0.001}>. 3) Failure: test_fast_generate(TC_JSONGenerate) [/builddir/build/BUILD/ruby-1.9.3-p0/test/json/test_json_generate.rb:78]: <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\u0000\u001F", "h"=>1000.0, "i"=>0.001}> expected but was <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\xA0\xA0", "h"=>1000.0, "i"=>0.001}>. 4) Failure: test_generate(TC_JSONGenerate) [/builddir/build/BUILD/ruby-1.9.3-p0/test/json/test_json_generate.rb:47]: <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\u0000\u001F", "h"=>1000.0, "i"=>0.001}> expected but was <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\xA0\xA0", "h"=>1000.0, "i"=>0.001}>. 5) Failure: test_generate_pretty(TC_JSONGenerate) [/builddir/build/BUILD/ruby-1.9.3-p0/test/json/test_json_generate.rb:61]: <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\u0000\u001F", "h"=>1000.0, "i"=>0.001}> expected but was <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\xA0\xA0", "h"=>1000.0, "i"=>0.001}>. 6) Failure: test_own_state(TC_JSONGenerate) [/builddir/build/BUILD/ruby-1.9.3-p0/test/json/test_json_generate.rb:92]: <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\u0000\u001F", "h"=>1000.0, "i"=>0.001}> expected but was <{"a"=>2, "b"=>3.141, "c"=>"c", "d"=>[1, "b", 3.14], "e"=>{"foo"=>"bar"}, "g"=>"\"\xA0\xA0", "h"=>1000.0, "i"=>0.001}>. 7) Failure: test_chars(TC_JSONUnicode) [/builddir/build/BUILD/ruby-1.9.3-p0/test/json/test_json_unicode.rb:57]: <"\x00"> expected but was <"\xA0">. 8) Failure: test_unicode(TC_JSONUnicode) [/builddir/build/BUILD/ruby-1.9.3-p0/test/json/test_json_unicode.rb:20]: <["\u00A9 \u2260 \u20AC! \u0001"]> expected but was <["\u00A9 \u2260 \u20AC! \xD8"]>. Please note that I am building Ruby using GCC 4.7 on Fedora Rawhide. I have not seen this errors before with GCC 4.6 -- http://bugs.ruby-lang.org/