From: jacknagel@... Date: 2014-10-13T17:16:54+00:00 Subject: [ruby-core:65678] [ruby-trunk - Bug #10290] segfault when calling a lambda recursively after rescuing SystemStackError Issue #10290 has been updated by Jack Nagel. I can reproduce it on 2.0.0-p576 when compiled with `-Os`, but not `-O2`: ``` $ make clean && ./configure --disable-install-doc CC=clang CFLAGS=-O2 && make -j12 $ ./miniruby -v ruby 2.0.0p576 (2014-09-19 revision 47627) [x86_64-darwin13.4.0] $ ./miniruby -e "l = -> { l.() }; begin; l.(); rescue SystemStackError; l.(); end" -e:1: stack level too deep (SystemStackError) $ make clean && ./configure --disable-install-doc CC=clang CFLAGS=-Os && make -j12 $ ./miniruby -v ruby 2.0.0p576 (2014-09-19 revision 47627) [x86_64-darwin13.4.0] $ ./miniruby -e "l = -> { l.() }; begin; l.(); rescue SystemStackError; l.(); end" Segmentation fault: 11 ``` On 2.1.3, it does not happen when compiled without optimizations, but even using `-O1` is enough to trigger it: ``` $ make clean && ./configure --disable-install-doc CC=clang && make -j12 $ ./miniruby -v ruby 2.1.3p242 (2014-09-19 revision 47629) [x86_64-darwin13.0] $ ./miniruby -e "l = -> { l.() }; begin; l.(); rescue SystemStackError; l.(); end" -e:1: stack level too deep (SystemStackError) $ make clean && ./configure --disable-install-doc CC=clang CFLAGS=-O1 && make -j12 $ ./miniruby -v ruby 2.1.3p242 (2014-09-19 revision 47629) [x86_64-darwin13.0] $ ./miniruby -e "l = -> { l.() }; begin; l.(); rescue SystemStackError; l.(); end" Segmentation fault: 11 ``` And similarly on trunk, it is triggered with `-O1` or higher: ``` $ make clean && ./configure --disable-install-doc CC=clang && make -j12 $ ./miniruby -v ruby 2.2.0dev (2014-10-14 trunk 47906) [x86_64-darwin13] $ ./miniruby -e "l = -> { l.() }; begin; l.(); rescue SystemStackError; l.(); end" -e:1:in `call': stack level too deep (SystemStackError) make clean && ./configure --disable-install-doc CC=clang CFLAGS=-O1 && make -j12 $ ./miniruby -v ruby 2.2.0dev (2014-10-14 trunk 47906) [x86_64-darwin13] $ ./miniruby -e "l = -> { l.() }; begin; l.(); rescue SystemStackError; l.(); end" Segmentation fault: 11 ``` I'm using the latest Apple clang: ``` $ clang --version Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) Target: x86_64-apple-darwin13.4.0 Thread model: posix ``` ---------------------------------------- Bug #10290: segfault when calling a lambda recursively after rescuing SystemStackError https://bugs.ruby-lang.org/issues/10290#change-49410 * Author: Jack Nagel * Status: Feedback * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: ruby 2.1.3p242 (2014-09-19 revision 47629) [x86_64-darwin13.0] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- The following code segfaults on Ruby 2.1.3: ``` l = -> { l.() } begin l.() rescue SystemStackError l.() # segfault end ``` the issue does not occur on trunk. ---Files-------------------------------- ruby_2014-09-25-000925_haswell.log (46.4 KB) ruby_2014-09-25-001644_haswell.log (46.8 KB) -- https://bugs.ruby-lang.org/