Issue #14101 has been updated by tom-lord (Tom Lord).


Here's a slightly more minimal reproduction example:

~~~ ruby
"abb".match /(?~(a)c)/
#=> ArgumentError: negative string size (or size too big)
~~~

My best guess is that the regexp engine is caught in an unexpected state, where the capture group still references an orphaned object?

----------------------------------------
Bug #14101: Unreliable handling of groups nested within absent/absence operator of regex
https://bugs.ruby-lang.org/issues/14101#change-67783

* Author: tom-lord (Tom Lord)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 2.5.0
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
The new absent/absence regex operator, added to Onigmo and bundled into ruby since v2.4.1, supports nested groupings such as:

~~~ruby
"abb".match /(?~(a|b)b)/
 => #<MatchData "a" 1:"a">
~~~

However, under some scenarios (I haven't been able to determine the exact cause), the execution fails:

~~~ ruby
"abb".match /(?~(a|c)c)/
ArgumentError: negative string size (or size too big)
from (irb):1:in `scan'
~~~

Interestingly, when running the above in `pry`, we see some malformed object created:

~~~ ruby
"abb".match /(?~(a|c)c)/
#=> #<MatchData "abb" 1:#<MatchData:0x3fd47ec398d4>

"abb".scan /(?~(a|c)c)/
#=> ArgumentError: negative string size (or size too big)
~~~

I am unclear whether this bug belongs in the ruby project, or Onigmo.
Documentation on the operator is still a work in progress (https://github.com/k-takata/Onigmo/issues/87); perhaps nested groups should not be allowed by the engine?



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>