RFR: 8320396: Class-File API ClassModel::verify should include checks from hotspot/share/classfile/classFileParser.cpp [v5]
Maurizio Cimadamore
mcimadamore at openjdk.org
Mon May 13 17:27:10 UTC 2024
On Thu, 9 May 2024 10:11:22 GMT, Adam Sotona <asotona at openjdk.org> wrote:
>> ClassFile API `jdk.internal.classfile.verifier.VerifierImpl` performed only bytecode-level class verification.
>> This patch adds `jdk.internal.classfile.verifier.ParserVerifier` with additional class checks inspired by `hotspot/share/classfile/classFileParser.cpp`.
>>
>> Also new `VerifierSelfTest::testParserVerifier` has been added.
>>
>> Please review.
>>
>> Thanks,
>> Adam
>
> Adam Sotona has updated the pull request incrementally with two additional commits since the last revision:
>
> - fixed error thrown by VerifierImpl
> - applied suggested changes
src/java.base/share/classes/jdk/internal/classfile/impl/verifier/ParserVerifier.java line 205:
> 203: private void verifyAttribute(AttributedElement ae, Attribute<?> a, List<VerifyError> errors) {
> 204: int payLoad = ((BoundAttribute)a).payloadLen();
> 205: if (payLoad != switch (a) {
Please break this up - e.g. with an intermediate `foundPayload` variable - having a multi-line switch nested as an if condition looks very jarring!
src/java.base/share/classes/jdk/internal/classfile/impl/verifier/ParserVerifier.java line 246:
> 244: }
> 245: case DeprecatedAttribute da -> 0;
> 246: case EnclosingMethodAttribute ema -> 4;
See 4.7.7:
> Otherwise, the value of the method_index item must be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_NameAndType_info structure ([§4.4.6](https://docs.oracle.com/javase/specs/jvms/se22/html/jvms-4.html#jvms-4.4.6)) representing the name and type of a method in the class referenced by the class_index attribute above.
src/java.base/share/classes/jdk/internal/classfile/impl/verifier/ParserVerifier.java line 247:
> 245: case DeprecatedAttribute da -> 0;
> 246: case EnclosingMethodAttribute ema -> 4;
> 247: case ExceptionsAttribute ea -> 2 + 2 * ea.exceptions().size();
See 4.7.5:
> Each value in the exception_index_table array must be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Class_info structure ([§4.4.1](https://docs.oracle.com/javase/specs/jvms/se22/html/jvms-4.html#jvms-4.4.1)) representing a class type that this method is declared to throw.
src/java.base/share/classes/jdk/internal/classfile/impl/verifier/ParserVerifier.java line 283:
> 281: yield l;
> 282: }
> 283: case RuntimeVisibleAnnotationsAttribute aa -> {
I wonder if these 4 cases can be consolidated a bit. They all require an annotation accessor, and then something that keeps computes the size of all the annotations. E.g.
int annotationSize(List<Annotation> annos) {
long size = 0;
for (var an : annos) {
size += annotationSize(an);
}
return l;
}
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/16809#discussion_r1598800394
PR Review Comment: https://git.openjdk.org/jdk/pull/16809#discussion_r1598806362
PR Review Comment: https://git.openjdk.org/jdk/pull/16809#discussion_r1598807397
PR Review Comment: https://git.openjdk.org/jdk/pull/16809#discussion_r1598803054
More information about the compiler-dev
mailing list