From: sam.rawlins@... Date: 2014-04-01T19:23:31+00:00 Subject: [ruby-core:61803] [ruby-trunk - Bug #9683] Segmentation fault when using default proc feature in ruby Hash object Issue #9683 has been updated by Sam Rawlins. File 9683.patch added Currently, trunk act's like Eran's example: `a[1]` first results in SystemStackError, then results in segmentation fault. I've tracked the segfault down to vm.c, in `vm_exec()`: 1327 vm_loop_start: 1328 result = vm_exec_core(th, initial); 1329 if ((state = th->state) != 0) { I _do_ see that we get to line 1328, but I don't think we actually enter `vm_exec_core()`. My debugging abilities end there :( In any case, maybe this should be solved like #9151 : cut it off and return nil if recursion is detected. I've attached a small patch with tests. This patch prevents the simple SystemStackError case, and permits some legitimate recursion, like in Psych's `yaml_tree.rb`: @dispatch_cache = Hash.new do |h,klass| method = "visit_#{(klass.name || '').split('::').join('_')}" method = respond_to?(method) ? method : h[klass.superclass] raise(TypeError, "Can't dump #{target.class}") unless method h[klass] = method end It also permits creative recursive uses of the default block: fac = Hash.new {|h,k| h[k] = h[k-1]*k }; fac[1] = 1 fac[10] #=> 3628800 == 10 factorial fib = Hash.new {|h,k| h[k] = h[k-2] + h[k-1] }; fib[1] = fib[2] = 1 fib[10] #=> 55, the 10th Fibonacci number collatz = Hash.new {|h,k| h[k] = k.even? ? h[k/2] + 1 : h[3*k+1] + 1 } collatz[1] = collatz[2] = collatz[4] = 0 collatz[7] #=> 14, the # of Collatz sequence steps to get from 7 to the 1-4-2 loop ---------------------------------------- Bug #9683: Segmentation fault when using default proc feature in ruby Hash object https://bugs.ruby-lang.org/issues/9683#change-46038 * Author: Eran Barak Levi * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- ��� bruno-v2 rvm:(ruby-2.1.0) git:(master) ��� uname -a Darwin erans-mbp.intkontera.com 13.1.0 Darwin Kernel Version 13.1.0: Thu Jan 16 19:40:37 PST 2014; root:xnu-2422.90.20~2/RELEASE_X86_64 x86_64 ��� bruno-v2 rvm:(ruby-2.1.0) git:(master) ��� rvm -v rvm 1.25.19 (stable) by Wayne E. Seguin , Michal Papis [https://rvm.io/] ��� bruno-v2 rvm:(ruby-2.1.0) git:(master) ��� ruby -v ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0] ��� bruno-v2 rvm:(ruby-2.1.0) git:(master) ��� ruby -e "a = Hash.new {|h,k| h[k] += 1};a[1]" 2> output [1] 24934 segmentation fault ruby -e "a = Hash.new {|h,k| h[k] += 1};a[1]" 2> output more information in the attached files ---Files-------------------------------- ruby_2014-03-27-153720_Erans-MacBook-Pro.crash (45.3 KB) output (489 KB) 9683.patch (1.31 KB) -- https://bugs.ruby-lang.org/