Project

General

Profile

Bug #14959

Updated by y4m4p (Masahiro Yamashita) over 1 year ago

# Disclaimer  
 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. 

 ## Backstory 
 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. 

 # Reproduction 
 ## Reproduction Project: 
 https://github.com/y4m4p/rails_issue_33460 

 ## Project Dependency 
 program 	 version 
 ruby 	         2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17] 
 Rails 	 5.2.0 
 Bundler 	 1.16.1 
 Mysql 	 5.7.21 Homebrew 

 ## Reproduction method 
 ~~~ ruby 
 def helper_method 
   if true 
     link_to 'page', some_view_path(foo: 'true') 
   else 
     link_to 'somewhere', some_view_path(foo: 'false') 
   end 
 end 
 ~~~ 

 ### Crash condition 
 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 
 ~~~ ruby 
 if true  
   ...  
 else  
   ... 
 ~~~ 
 OR 
 ~~~ ruby 
 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.  
 ~~~ ruby 
 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. 
 ~~~ ruby 
 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. 
 ~~~ ruby 
 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. 
 ~~~ ruby 
 # 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 %> 
 ~~~ 
 
 
 

 ## Expected 
 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.)

Back