Bug #8611

Minitest encoding problems.

Added by Boris Stitnicky 9 months ago. Updated 9 months ago.

[ruby-core:55850]
Status:Feedback
Priority:Normal
Assignee:-
Category:-
Target version:-
ruby -v:2.0.0.latest patch Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

A long standing annoying misfeature of minitest is the problem with encoding, which I have solved by patching the backtrace.join line in units.rb, #puke method with map{ |str| str.force_encoding( "UTF-8 ) }. If I don't do this, the tests in irb won't run, instead I get a complaint about "ASCII 8" versus "UTF-8" incompatibility. Only happens when one extensively uses UTF characters when coding, an annoying intermittent error.

History

#1 Updated by Boris Stitnicky 9 months ago

Sorry for a terse report and lack of supporting materials, I'm extremely busy now.

#2 Updated by Yui NARUSE 9 months ago

  • Status changed from Open to Feedback

You know, this must have reproducible code.

#3 Updated by Boris Stitnicky 9 months ago

All right, I am no longer getting the same error since I patched it for myself, but to illustrate what I am talking about, here is another way to crash irb in basically the same way, pointing to a wider problem. It can be illustrated with Pyper gem that I wrote as follows:

gem install 'pyper'
a = [1, 3, 4, 3, 0, 3, 1]
a.τsπ( :uniq ).χOixπ.χriXgζmEπ # consider it fuzz testing :-)

NoMethodError ensues, that crashes the irb:

NoMethodError: undefined method map' for 0:Fixnum
/usr/local/lib/ruby/2.0.0/irb.rb:526:in
join': incompatible character encodings: ASCII-8BIT and UTF-8 (Encoding::CompatibilityError)
from /usr/local/lib/ruby/2.0.0/irb.rb:526:in block (2 levels) in eval_input'
from /usr/local/lib/ruby/2.0.0/irb.rb:624:in
signalstatus'
from /usr/local/lib/ruby/2.0.0/irb.rb:489:in block in eval_input'
from /usr/local/lib/ruby/2.0.0/irb/ruby-lex.rb:247:in
block (2 levels) in each
toplevelstatement'
from /usr/local/lib/ruby/2.0.0/irb/ruby-lex.rb:233:in loop'
from /usr/local/lib/ruby/2.0.0/irb/ruby-lex.rb:233:in
block in eachtoplevelstatement'
from /usr/local/lib/ruby/2.0.0/irb/ruby-lex.rb:232:in catch'
from /usr/local/lib/ruby/2.0.0/irb/ruby-lex.rb:232:in
each
toplevelstatement'
from /usr/local/lib/ruby/2.0.0/irb.rb:488:in eval_input'
from /usr/local/lib/ruby/2.0.0/irb.rb:397:in
block in start'
from /usr/local/lib/ruby/2.0.0/irb.rb:396:in catch'
from /usr/local/lib/ruby/2.0.0/irb.rb:396:in
start'
from /usr/local/bin/irb:12:in `'

Note that eg.

a.τsπ( :uniq ).χOixπ.χriXgζqτ.tap { fail NoMethodError }

raises NoMethodError without crashing the irb.

Also available in: Atom PDF