Possible ClassCastException in java.util.regex.Pattern.BmpCharPredicate#union(java.util.regex.Pattern.CharPredicate...)

Andrey Turbanov turbanoff at gmail.com
Fri Aug 27 14:37:45 UTC 2021


Hello.
I found suspicious code in the method
"java.util.regex.Pattern.BmpCharPredicate#union(java.util.regex.Pattern.CharPredicate...)"
https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/regex/Pattern.java#L5639

static CharPredicate union(CharPredicate... predicates) {
    CharPredicate cp = ch -> {
        for (CharPredicate p : predicates) {
            if (!p.is(ch))
                return false;
        }
        return true;
    };
    for (CharPredicate p : predicates) {
        if (! (p instanceof BmpCharPredicate))
            return cp;
    }
    return (BmpCharPredicate)cp;
}

Variable `cp` has type CharPredicate initially. And then it's casted
to BmpCharPredicate. This cast always fails with ClassCastException
when reached.

Can reproduced in small sample class:

    public static void main(String[] args) {
        CharPredicate result = BmpCharPredicate.union();
        System.out.println(result);
    }

    interface CharPredicate {
        boolean is(int ch);
    }

    interface BmpCharPredicate extends CharPredicate {
        static CharPredicate union(CharPredicate... predicates) {
            CharPredicate cp = ch -> true;
            for (CharPredicate p : predicates) {
                if (! (p instanceof BmpCharPredicate))
                    return cp;
            }
            return (BmpCharPredicate)cp;
        }
    }


Exception in thread "main" java.lang.ClassCastException: class
org.RegexpBug$BmpCharPredicate$$Lambda$14/0x0000000800c028f0 cannot be
cast to class org.RegexpBug$BmpCharPredicate
(org.RegexpBug$BmpCharPredicate$$Lambda$14/0x0000000800c028f0 and
org.RegexpBug$BmpCharPredicate are in unnamed module of loader 'app')
    at org.RegexpBug$BmpCharPredicate.union(RegexpBug.java:20)
    at org.RegexpBug.main(RegexpBug.java:5)

As I can see this method is never used. Perhaps it should be removed?


Andrey Turbanov


More information about the core-libs-dev mailing list