]> Cypherpunks.ru repositories - gostls13.git/commit
regexp: document and implement that invalid UTF-8 bytes are the same as U+FFFD
authorRuss Cox <rsc@golang.org>
Thu, 7 Oct 2021 13:56:29 +0000 (09:56 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 11 Oct 2021 15:28:50 +0000 (15:28 +0000)
commit702e33717486cb8331db17304f2369ef641da61f
treea024631a5c2497d89ad7da56979025fe2ac8bf0a
parent34f7b1f841cc450cc3aba42019e613fd03a84fce
regexp: document and implement that invalid UTF-8 bytes are the same as U+FFFD

What should it mean to run a regexp match on invalid UTF-8 bytes?
The coherent behavior options are:

1. Invalid UTF-8 does not match any character classes,
   nor a U+FFFD literal (nor \x{fffd}).
2. Each byte of invalid UTF-8 is treated identically to a U+FFFD in the input,
   as a utf8.DecodeRune loop might.

RE2 uses Rule 1.
Because it works byte at a time, it can also provide \C to match any
single byte of input, which matches invalid UTF-8 as well.
This provides the nice property that a match for a regexp without \C
is guaranteed to be valid UTF-8.

Unfortunately, today Go has an incoherent mix of these two, although
mostly Rule 2. This is a deviation from RE2, and it gives up the nice
property, but we probably can't correct that at this point.
In particular .* already matches entire inputs today, valid UTF-8 or
not, and I doubt we can break that.

This CL adopts Rule 2 officially, fixing the few places that deviate from it.

Fixes #48749.

Change-Id: I96402527c5dfb1146212f568ffa09dde91d71244
Reviewed-on: https://go-review.googlesource.com/c/go/+/354569
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
src/regexp/all_test.go
src/regexp/find_test.go
src/regexp/onepass.go
src/regexp/regexp.go
src/regexp/syntax/prog.go