Writing a "link_to" method and a "url_helper" with a request parameter under certain "if else" statement in Rails helper crashes with KERN_INVALID_ADDRESS at 0x0000000000000000
Sorry about the problem being rails, and not ruby specific. I couldn't narrow down the problem and wording it correctly.
As it turns out that the problem derived from the ruby vm used in my Rails application, I decided to create the issue here.
I have created this issue in rails/rails. (https://github.com/rails/rails/issues/33460)
I became aware that this issue derives from Shopify/bootsnap (https://github.com/Shopify/bootsnap/issues/182)
The member there told me that this is an issue with the ruby vm itself, so I have created this issue here.
Please refer for more information in the above link.
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
Mysql 5.7.21 Homebrew
def helper_method if true link_to 'page', some_view_path(foo: 'true') else link_to 'somewhere', some_view_path(foo: 'false') end end
Writing this helper method under "app/helper" directory in Rails which satisfies all of the next particular conditions will crash the Rails server application with
KERN_INVALID_ADDRESS at 0x0000000000000000.
- Writing a condition with
if true ... else ...
if false ... else ...
- Write a path using the "link_to" helper and a "url_helper (xxx_path)" which contains a "request parameter" (xxx_path(some_parameter: 'x')).
- Writing the process under the statement that will never be used.
For example, if you write the "if" sentence with "if true" then you must write your process under the "else" statement and vice versa.
Non crashing condition¶
- Writing the "if" condition with a instance variable or constant.
def helper_method condition = true if condition ... else ... end end
- Do not write the specific "link_to" helper process under the statement that will never be used.
def helper_method if true link_to 'somewhere', web_pages_some_view_path(foo: 'true') else # link_to 'somewhere', web_pages_some_view_path(foo: 'false') <= comment out end end
- Do not write the request parameter for the "url_helper" path.
def helper_method if true link_to 'somewhere', web_pages_some_view_path(foo: 'true') #<= Writing the request parameter in the used statement is OK else link_to 'somewhere', web_pages_some_other_view_path end end
- Do not write the process in helper. But rather, writing the process in the view itself will not crash.
# app/view/web_pages/some_view.html.erb <%= if true link_to 'somewhere', web_pages_some_view_path(foo: 'true') else link_to 'somewhere', web_pages_some_view_path(foo: 'false') end %>
Should render correct views with link and not crash.
Even though I am writing the "if" condition with "true" which makes the "else" statement useless, but this should work as intended. (Just render the "true" statement.)
Updated by rafaelfranca (Rafael França) about 4 years ago
Minimal reproduction steps.
code = <<~CODE module ApplicationHelper def broken_helper_in_application_helper if true else link_to 'somewhere', some_view_path(foo: 'false') end end end CODE RubyVM::InstructionSequence.compile(code).to_binary
Updated by ujihisa (Tatsuhiro Ujihisa) about 4 years ago
I'm not sure if it's going to be backported to current stable version 2.5 but let me clarify couple things just in case for future.
- This is issue does not depend neither rails nor bootsnap
- Yet another minimal reproducible code to segfault
RubyVM::InstructionSequence.compile(<<~CODE).to_binary f(x: 1) if false CODE
Workaround for users who use old versions: Just replace "false" with "!true". "nil" or "unless true" will stil segfault.
# workaround RubyVM::InstructionSequence.compile(<<~CODE).to_binary f(x: 1) if !true CODE