From: nagachika00@... Date: 2020-03-27T02:24:25+00:00 Subject: [ruby-core:97601] [Ruby master Bug#16676] `#hash` can change Hash object from ar_table to st_table Issue #16676 has been updated by nagachika (Tomoyuki Chikanaga). File bugs_16676_patch_for_2_6.patch added I created the patch for ruby_2_6 branch (attatched file). But the test_ar2st failed. ``` 1) Failure: TestHash#test_ar2st [/Users/nagachika/opt/ruby-2.6/src/ruby_2_6/test/ruby/test_hash.rb:1749]: <"{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, test=>true}"> expected but was <"{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9}">. 2) Failure: TestHash::TestSubHash#test_ar2st [/Users/nagachika/opt/ruby-2.6/src/ruby_2_6/test/ruby/test_hash.rb:1749]: <"{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, test=>true}"> expected but was <"{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9}">. ``` ---------------------------------------- Bug #16676: `#hash` can change Hash object from ar_table to st_table https://bugs.ruby-lang.org/issues/16676#change-84787 * Author: ko1 (Koichi Sasada) * Status: Closed * Priority: Normal * Assignee: ko1 (Koichi Sasada) * Target version: 2.8 * Backport: 2.5: UNKNOWN, 2.6: REQUIRED, 2.7: DONE ---------------------------------------- # Points * Hash representation `ar_table` has a problem from Ruby 2.6 (need to backport) # Problem From Ruby 2.6 `Hash` object is represented by `ar_table` (for small (<=8) pairs) and `st_table`. To lookup hash table, `Object#hash` is called to get a hash value, and this method call can modify Hash object. It means that the code assumes the Hash representation is a `ar_table`, but calling the `#hash` method, it can be a `st_table`. I believe nobody modify Hash table from `#hash` method (it should be pure, no-side effect method), but multi-threads can modify a Hash object, it can be exposed. I will commit a patch soon. # Workaround To avoid this issue, making a hash table in `st_table`, for example: ``` h = {} # ar_table 10.times{|i| h[i] = i} # st_table because the number of pair == 10 (> 8) h.clear ``` ---Files-------------------------------- bugs_16676_patch_for_2_6.patch (3.37 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: