On Mon, 25 Sep 2023 15:52:12 GMT, Aleksei Voitylov <avoity...@openjdk.org> wrote:
> test java.lang.String.RegionMatches1Tests fails on all platforms with > -XX:-CompactStrings option and on ARM32 where Compact Strings is disabled by > default. The fix is to return true immediately if len is negative, since for > negative length this condition will never be satisfied. > > Testing: JCK, JTREG passed with the fix with -XX:-CompactStrings on x86_64 > and on ARM32. Nice catch, but I don't think your current fix is correct: src/java.base/share/classes/java/lang/String.java line 2159: > 2157: return false; > 2158: } > 2159: // Any strings match if length < 0 I don't think this fix works, because the specification says: *The result is false if and only if at least one of the following is true:* - `toffset` is negative. - `ooffset` is negative. - `toffset+len` is greater than the length of this String object. - `ooffset+len` is greater than the length of the other argument. - There is some nonnegative integer `k` less than `len` such that: `this.charAt(toffset + k) != other.charAt(ooffset + k)` Now consider `"12345".regionMatches(10, "012345", 1, -3)` With the current implementation, the call returns `false` because `toffset + len` == `10 + (-3)` == 7 > 5 == `"12345".length()`. With your fix, the call will succeed because `len` == `-3` < `0`. ------------- Changes requested by simonis (Reviewer). PR Review: https://git.openjdk.org/jdk/pull/15906#pullrequestreview-1642643067 PR Review Comment: https://git.openjdk.org/jdk/pull/15906#discussion_r1336170810