Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8189343

Change of behavior of java.util.regex.Pattern between JDK 8 and JDK 9

XMLWordPrintable

    • b119
    • 9
    • generic
    • generic

      FULL PRODUCT VERSION :
      java version "9"
      Java(TM) SE Runtime Environment (build 9+181)
      Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)


      A DESCRIPTION OF THE PROBLEM :
      java.util.regex.Pattern behaves differently for pattern "[^x&&[^\n]]" and similar ones in JDK 8 and JDK 9 as shown in reproducer below. Seems that this change of behavior went unnoticed - at least I wasn't able to find any explicit mention of this in release notes and resolved tickets. Also seems that this was introduced by changes for JDK-6328855.

      IMO description of java.util.regex.Pattern is not very clear about behavior in this and similar cases and anyway requires update.

      REGRESSION. Last worked in version 8u144

      ADDITIONAL REGRESSION INFORMATION:
      java version "1.8.0_144"
      Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
      Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

      Log of bisection of hg.openjdk.java.net/jdk10/master/ :

      $ hg bisect --bad jdk-9+140
      $ hg bisect --good jdk-9+110
      Testing changeset 39088:69bb31538c06 (4725 changesets remaining, ~12 tests)

      # test failed
      $ hg bisect --bad
      Testing changeset 38128:22391eb0c22d (2357 changesets remaining, ~11 tests)

      # build failed
      $ hg bisect --skip
      Testing changeset 38127:2ab00cd4556e (2357 changesets remaining, ~11 tests)
      $ hg bisect --skip
      Testing changeset 37914:a2f43d835fa1 (2357 changesets remaining, ~11 tests)

      # test failed
      $ hg bisect --bad
      Testing changeset 37302:cf820d974c75 (1183 changesets remaining, ~10 tests)

      # build failed
      $ hg bisect --skip
      Testing changeset 37301:a936b4e01afb (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37300:82e233a4a546 (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37477:0ca0b7388bb6 (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37299:db3b0d4c3bda (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37298:8df0cc9da41e (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37478:ef779fb991cf (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37507:bade77e200d0 (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37374:ee1b8619eddb (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37508:3bf78337709d (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37377:bd3b98a11a14 (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37509:bdb5e37b92f9 (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37510:cf066fe4531b (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37511:2cd9b35e0eda (1183 changesets remaining, ~10 tests)
      $ hg bisect --skip
      Testing changeset 37380:55c2549714af (1183 changesets remaining, ~10 tests)

      # test passed
      $ hg bisect --good
      Testing changeset 37646:84aba7335005 (534 changesets remaining, ~9 tests)
      $ hg bisect --good
      Testing changeset 37795:c5dc5ab60139 (267 changesets remaining, ~8 tests)

      # build failed
      $ hg bisect --skip
      Testing changeset 37796:256c45c4af5d (267 changesets remaining, ~8 tests)
      $ hg bisect --skip
      Testing changeset 37794:7223f8ad31a5 (267 changesets remaining, ~8 tests)
      $ hg bisect --skip
      Testing changeset 37797:b84e375f071d (267 changesets remaining, ~8 tests)
      $ hg bisect --skip
      Testing changeset 37793:41844efbbcce (267 changesets remaining, ~8 tests)
      $ hg bisect --skip
      Testing changeset 37798:e1de34b6475c (267 changesets remaining, ~8 tests)
      $ hg bisect --skip
      Testing changeset 37777:08b7d4a71e11 (267 changesets remaining, ~8 tests)

      # test passed
      $ hg bisect --good
      Testing changeset 37846:772743807917 (137 changesets remaining, ~7 tests)
      $ hg bisect --good
      Testing changeset 37894:3acc9608c162 (68 changesets remaining, ~6 tests)

      # test failed
      $ hg bisect --bad
      Testing changeset 37877:dae28a12fb38 (34 changesets remaining, ~5 tests)

      # test passed
      $ hg bisect --good
      Testing changeset 37885:5ac482a31fd5 (17 changesets remaining, ~4 tests)

      # test failed
      $ hg bisect --bad
      Testing changeset 37881:fda31effa7b3 (8 changesets remaining, ~3 tests)

      # test passed
      $ hg bisect --good
      Testing changeset 37883:e2acd0d8d716 (4 changesets remaining, ~2 tests)

      # test failed
      $ hg bisect --bad
      Testing changeset 37882:e7f3cf12e739 (2 changesets remaining, ~1 tests)

      $ hg bisect --bad
      The first bad revision is:
      changeset: 37882:e7f3cf12e739
      user: sherman
      date: Tue May 10 21:19:25 2016 -0700
      summary: 6328855: String: Matches hangs at short and easy Strings containing \r \n

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Compile and execute provided source file.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      no exception as was with JDK 8
      ACTUAL -
      Exception in thread "main" java.lang.AssertionError
              at Example.test(Example.java:11)
              at Example.main(Example.java:6)

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      class Example {
        public static void main(String[] args) {
          String p = "[^x&&[^\n]]";
          test(p, "x", false);
          test(p, "y", true);
          test(p, "\n", false);
        }

        private static void test(String p, String i, boolean e) {
          if (java.util.regex.Pattern.compile(p).matcher(i).matches() != e) {
            throw new AssertionError();
          }
        }
      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Can be replaced by "[[^x]&&[^\n]]" or by "[^x\n]", whose behavior is the same in JDK 8 and JDK 9.

      Or simply do not use weird regular expressions ;)

            sherman Xueming Shen
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: