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