Poor performance processing repeated conditional reassignments
Author: amarshallCreated Jan 27, 2021Updated Aug 23, 2026
Background
Brakeman version: 5.0.0 Rails version: 5.2.4.4 Ruby version: 2.7.1
Link to Rails application code: N/A (closed source)
Hanging or Slowness
Below code example was added as ./app/whatever/test.rb in a Rails application. The code is based off real code exhibiting this issue but names are obviously obfuscated and I’ve tried to reduce to a minimal example for reproduction.
Processing times (“calls” means the number of x = fooN(x) if bar? lines):
- With 30 calls: unknown, user-terminated after 60 s
- With 20 calls: ~ 10 s
- With 10 calls: ~ 2.6 s
With terminating with --debug, the top of the stacktrace is:
brakeman-5.0.0/lib/ruby_parser/bm_sexp.rb:32:in `block in deep_clone'
brakeman-5.0.0/lib/ruby_parser/bm_sexp.rb:30:in `each'
brakeman-5.0.0/lib/ruby_parser/bm_sexp.rb:30:in `deep_clone'
… above three lines repeat 10+ times
brakeman-5.0.0/lib/brakeman/processors/alias_processor.rb:86:in `replace'
brakeman-5.0.0/lib/brakeman/processors/alias_processor.rb:75:in `process_default'
brakeman-5.0.0/lib/ruby_parser/bm_sexp_processor.rb:78:in `block in process'
brakeman-5.0.0/lib/ruby_parser/bm_sexp_processor.rb:113:in `in_context'
brakeman-5.0.0/lib/ruby_parser/bm_sexp_processor.rb:72:in `process'
brakeman-5.0.0/lib/brakeman/processors/alias_processor.rb:62:in `block in process_default'
…Code example:
class BrakemanTest
def f
x = foo001(x) if bar?
x = foo002(x) if bar?
x = foo003(x) if bar?
x = foo004(x) if bar?
x = foo005(x) if bar?
x = foo006(x) if bar?
x = foo007(x) if bar?
x = foo008(x) if bar?
x = foo009(x) if bar?
x = foo010(x) if bar?
x = foo011(x) if bar?
x = foo012(x) if bar?
x = foo013(x) if bar?
x = foo014(x) if bar?
x = foo015(x) if bar?
x = foo016(x) if bar?
x = foo017(x) if bar?
x = foo018(x) if bar?
x = foo019(x) if bar?
x = foo020(x) if bar?
x = foo021(x) if bar?
x = foo022(x) if bar?
x = foo023(x) if bar?
x = foo024(x) if bar?
x = foo025(x) if bar?
x = foo026(x) if bar?
x = foo027(x) if bar?
x = foo028(x) if bar?
x = foo029(x) if bar?
x = foo030(x) if bar?
x
end
end
Source: presidentbeef/brakeman