Skip to content

Style/SafeNavigation crash on non-safenavigation code #14477

@mlinksva

Description

@mlinksva

No later than June 8 rubocop Style/SafeNavigation began crashing on

@license_field = match ? match[1].downcase : nil

Fix for my application was to actually use safe navigation (which is fine, and might not even mind being told to do this, but don't expect a crash on the above in any case).

@license_field = match&.[](1)&.downcase

Expected behavior

Expect SafeNavigaiton to not do anything on this code, let alone crash.

Actual behavior

An error occurred while Style/SafeNavigation cop was inspecting /workspaces/licensee/lib/licensee/matchers/cran.rb:22:25.
/usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/corrector.rb:111:in 'RuboCop::Cop::Corrector#to_range': Expected a Parser::Source::Range, Comment or RuboCop::AST::Node, got NilClass (TypeError)
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/corrector.rb:120:in 'RuboCop::Cop::Corrector#check_range_validity'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/parser-3.3.9.0/lib/parser/source/tree_rewriter.rb:398:in 'Parser::Source::TreeRewriter#combine'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/parser-3.3.9.0/lib/parser/source/tree_rewriter.rb:207:in 'Parser::Source::TreeRewriter#wrap'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/parser-3.3.9.0/lib/parser/source/tree_rewriter.rb:231:in 'Parser::Source::TreeRewriter#insert_before'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/style/safe_navigation.rb:160:in 'block in RuboCop::Cop::Style::SafeNavigation#on_if'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/style/safe_navigation.rb:203:in 'block in RuboCop::Cop::Style::SafeNavigation#report_offense'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/base.rb:426:in 'RuboCop::Cop::Base#correct'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/base.rb:210:in 'RuboCop::Cop::Base#add_offense'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/style/safe_navigation.rb:195:in 'RuboCop::Cop::Style::SafeNavigation#report_offense'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/style/safe_navigation.rb:158:in 'RuboCop::Cop::Style::SafeNavigation#on_if'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:107:in 'Kernel#public_send'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:107:in 'block (2 levels) in RuboCop::Cop::Commissioner#trigger_responding_cops'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:171:in 'RuboCop::Cop::Commissioner#with_cop_error_handling'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:106:in 'block in RuboCop::Cop::Commissioner#trigger_responding_cops'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:105:in 'Array#each'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:105:in 'RuboCop::Cop::Commissioner#trigger_responding_cops'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:69:in 'RuboCop::Cop::Commissioner#on_if'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:144:in 'RuboCop::AST::Traversal#on_lvasgn'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:71:in 'RuboCop::Cop::Commissioner#on_ivasgn'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:146:in 'block in RuboCop::AST::Traversal#on_dstr'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:146:in 'Array#each'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:146:in 'RuboCop::AST::Traversal#on_dstr'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:71:in 'RuboCop::Cop::Commissioner#on_begin'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:163:in 'RuboCop::AST::Traversal#on_def'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:71:in 'RuboCop::Cop::Commissioner#on_def'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:146:in 'block in RuboCop::AST::Traversal#on_dstr'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:146:in 'Array#each'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:146:in 'RuboCop::AST::Traversal#on_dstr'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:71:in 'RuboCop::Cop::Commissioner#on_begin'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:163:in 'RuboCop::AST::Traversal#on_class'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:71:in 'RuboCop::Cop::Commissioner#on_class'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:147:in 'RuboCop::AST::Traversal#on_while'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:71:in 'RuboCop::Cop::Commissioner#on_module'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:147:in 'RuboCop::AST::Traversal#on_while'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:71:in 'RuboCop::Cop::Commissioner#on_module'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-ast-1.46.0/lib/rubocop/ast/traversal.rb:20:in 'RuboCop::AST::Traversal#walk'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/commissioner.rb:87:in 'RuboCop::Cop::Commissioner#investigate'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/team.rb:174:in 'RuboCop::Cop::Team#investigate_partial'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cop/team.rb:108:in 'RuboCop::Cop::Team#investigate'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:348:in 'block in RuboCop::Runner#inspect_file'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:347:in 'Array#each'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:347:in 'Enumerable#flat_map'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:347:in 'RuboCop::Runner#inspect_file'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:290:in 'block in RuboCop::Runner#do_inspection_loop'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:324:in 'block in RuboCop::Runner#iterate_until_no_changes'
        from <internal:kernel>:168:in 'Kernel#loop'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:317:in 'RuboCop::Runner#iterate_until_no_changes'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:286:in 'RuboCop::Runner#do_inspection_loop'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:167:in 'block in RuboCop::Runner#file_offenses'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:192:in 'RuboCop::Runner#file_offense_cache'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:166:in 'RuboCop::Runner#file_offenses'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:154:in 'RuboCop::Runner#process_file'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:135:in 'block in RuboCop::Runner#each_inspected_file'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:134:in 'Array#each'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:134:in 'Enumerable#reduce'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:134:in 'RuboCop::Runner#each_inspected_file'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:120:in 'RuboCop::Runner#inspect_files'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/runner.rb:73:in 'RuboCop::Runner#run'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli/command/execute_runner.rb:26:in 'block in RuboCop::CLI::Command::ExecuteRunner#execute_runner'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli/command/execute_runner.rb:52:in 'RuboCop::CLI::Command::ExecuteRunner#with_redirect'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli/command/execute_runner.rb:25:in 'RuboCop::CLI::Command::ExecuteRunner#execute_runner'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli/command/execute_runner.rb:17:in 'RuboCop::CLI::Command::ExecuteRunner#run'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli/command.rb:11:in 'RuboCop::CLI::Command.run'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli/environment.rb:18:in 'RuboCop::CLI::Environment#run'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli.rb:128:in 'RuboCop::CLI#run_command'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli.rb:135:in 'RuboCop::CLI#execute_runners'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli.rb:54:in 'block in RuboCop::CLI#run'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli.rb:87:in 'RuboCop::CLI#profile_if_needed'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/lib/rubocop/cli.rb:45:in 'RuboCop::CLI#run'
        from /usr/local/rvm/gems/ruby-3.4.1/gems/rubocop-1.80.0/exe/rubocop:15:in '<top (required)>'
        from /usr/local/rvm/gems/ruby-3.4.1/bin/rubocop:25:in 'Kernel#load'
        from /usr/local/rvm/gems/ruby-3.4.1/bin/rubocop:25:in '<main>'
        from /usr/local/rvm/gems/ruby-3.4.1/bin/ruby_executable_hooks:22:in 'Kernel#eval'
        from /usr/local/rvm/gems/ruby-3.4.1/bin/ruby_executable_hooks:22:in '<main>'

Steps to reproduce the problem

See code example at top.

RuboCop version

Observed with these versions:

  • 1.76.0 (using Parser 3.3.8.0, rubocop-ast 1.45.1, analyzing as Ruby 3.0, running on ruby 3.4.4) [x86_64-linux]
  • 1.79.2 (using Parser 3.3.9.0, rubocop-ast 1.46.0, analyzing as Ruby 3.0, running on ruby 3.4.5) [x86_64-linux]
  • 1.80.0 (using Parser 3.3.9.0, rubocop-ast 1.46.0, analyzing as Ruby 3.0, running on ruby 3.4.1) [x86_64-linux]

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions