seattlerb / debride

Analyze code for potentially uncalled / dead methods, now with auto-removal.
https://www.zenspider.com/projects/debride.html
720 stars 19 forks source link

Regexp with `#$` breaks Racc parser #10

Closed rafaelfranca closed 9 years ago

rafaelfranca commented 9 years ago

Seems that the combination of # and $ on this exactly order (#$) makes racc to fail.

A simple example of a file that reproduces this error:

class Foo
  validates :password, format: { with: /[#$]/ }
end

The output:

/opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/racc/parser.rb:529:in `on_error': foo.rb:2 :: parse error on value ":" (tCOLON) (Racc::ParseError)
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1124:in `on_error'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/racc/parser.rb:258:in `_racc_do_parse_c'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/racc/parser.rb:258:in `do_parse'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1036:in `block in process'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1024:in `process'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1357:in `block in process'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1355:in `each'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1355:in `process'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:89:in `process_rb'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:80:in `block in run'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:67:in `each'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:67:in `run'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:62:in `run'
    from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/bin/debride:5:in `<top (required)>'
    from /opt/boxen/rbenv/versions/2.0.0-p247/bin/debride:23:in `load'
    from /opt/boxen/rbenv/versions/2.0.0-p247/bin/debride:23:in `<main>'

And it seems to be valid Ruby:

>> r = /[#$]/
=> /[#$]/
>> r
=> /[#$]/
>> r =~ '$'
=> 0
>> r =~ 'a'
=> nil
>> r =~ '#'
=> 0
>> r =~ '$'
=> 0
zenspider commented 9 years ago

Yup. Known issue fixed in next version of ruby_parser.

I hope that regex isn't for detecting comment lines.

On Apr 10, 2015, at 11:44, Rafael Mendonça França notifications@github.com wrote:

Seems that the combination of # and $ on this exactly order (#$) makes racc to fail.

A simple example of a file that reproduces this error:

class Foo validates :password, format: { with: /[#$]/ } end The output:

/opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/racc/parser.rb:529:in on_error': foo.rb:2 :: parse error on value ":" (tCOLON) (Racc::ParseError) from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1124:inon_error' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/racc/parser.rb:258:in _racc_do_parse_c' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/racc/parser.rb:258:indo_parse' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1036:in block in process' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/timeout.rb:52:intimeout' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1024:in process' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1357:inblock in process' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1355:in each' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/ruby_parser-3.6.5/lib/ruby_parser_extras.rb:1355:inprocess' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:89:in process_rb' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:80:inblock in run' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:67:in each' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:67:inrun' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/lib/debride.rb:62:in run' from /opt/boxen/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/debride-1.2.0/bin/debride:5:in<top (required)>' from /opt/boxen/rbenv/versions/2.0.0-p247/bin/debride:23:in load' from /opt/boxen/rbenv/versions/2.0.0-p247/bin/debride:23:in

' And it seems to be valid Ruby:

r = /[#$]/ => /[#$]/ r => /[#$]/ r =~ '$' => 0 r =~ 'a' => nil r =~ '#' => 0 r =~ '$' => 0 — Reply to this email directly or view it on GitHub.

rafaelfranca commented 9 years ago

Cool! So closing this. I'm glad it is already fixed.

@zenspider you would be surprised if I told you what this regex does.