Bug #9589
closedStack level too deep during eval causes segmentation fault
Description
The following silly code, which imho should generate a " stack level too deep (SystemStackError)", segfaults
$ echo 'eval($)' | ruby -n -e 'eval($)'
I thought it may be a bug, not sure.
My version:
carlos-mac$ ruby -v
ruby 1.9.3p327 (2012-11-10) [x86_64-darwin12.2.0]
Updated by Cezary (Cezary Baginski) over 10 years ago
Not sure if it's related, but I'm getting segfaults instead of SystemStackErrors with recursive lambda calls from:
example_spec.rb:
describe Fixnum do subject { subject } it { should be } end
by running:
rspec example_spec.rb
using this version of rspec:
rspec (2.14.1) rspec-core (2.14.8)
Both on:
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
and:
ruby 2.2.0dev (2014-03-04 trunk 45264) [x86_64-linux]
but the debug build of 2.2.0 (-O0 and -ggdb3) gives SystemStackError as expected.
(all examples compiled with gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3)
Updated by carlosayam (carlos aya) over 10 years ago
Interesting, I searched the rspec-core code and it uses instance_eval/class_eval. That prompted me to try these faulty snippets...
b = Proc.new do b.instance_eval(&b) end b.instance_eval(&b)
and this one too...
b = Proc.new do Proc.class_eval(&b) end Proc.class_eval(&b)
Both segfault. I suspect eval, instance_eval and class_eval are not guarded against stack errors (again v.1.9.3 not sure about 2.x).
Updated by runephilosof (Rune Philosof) over 10 years ago
This bug should be against the newest ruby stable 2.1.2, but I cannot change that.
I just encountered it in a spec that looks like this:
require 'spec_helper'
describe "test" do
let(:die) { "this is fine" }
context "with bad context" do
let(:die) { die + ", but this will fail" }
it "it throws segmentation fault" do
expect { die }.to raise_error("Segmentation Fault")
end
end
end
This is with ruby 2.1.2 and rspec-core 2.14.8
Updated by decuplet (Nikita Shilnikov) over 10 years ago
This command fails with segfault on 2.1.1 and 2.1.2:
ruby -e 'define_method(:bar) {send(:bar)}; bar'
It's OK on 2.0.0 and below.
Updated by jeremyevans0 (Jeremy Evans) about 5 years ago
- Status changed from Open to Closed
- Backport deleted (
1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN)
From my testing with class Object; define_method(:bar) {send(:bar)}; bar end
:
1.9-2.1: SystemStackError
2.2-2.4: segfault
2.5-master: SystemStackError
As this issue appears to have been fixed, closing. If you can reproduce with a currently supported Ruby version, please post back here.