-
Bug
-
Resolution: Not an Issue
-
P3
-
24
-
None
Additional information
javac -fullversion
javac full version "24-internal-2024-08-26-....
Description of the problem
While doing some work around ClassFile API, I ran into a NullPointerException after adding a null check to `ModuleRequireInfo of(ModuleEntry requires, int requiresFlags, Utf8Entry requiresVersion)` on `requiresVersion`
Github link: https://github.com/openjdk/jdk/blob/b840b130df7ccb64d4615460c0654a6315e9302f/src/java.base/share/classes/java/lang/classfile/attribute/ModuleRequireInfo.java#L89
The issue stems from BoundAttribute.java, where you find this piece of code
```
ModuleRequireInfo.of(classReader.readEntry(p, ModuleEntry.class),
classReader.readU2(p + 2),
classReader.readEntryOrNull(p + 4, Utf8Entry.class)
```
Github link: https://github.com/openjdk/jdk/blob/b840b130df7ccb64d4615460c0654a6315e9302f/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java#L644
`readEntryOrNull` is Optional and returns null
The build breaks after adding the null check with the following error
Creating jdk.jlink.jmod
Error: null
java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:220)
at java.base/java.lang.classfile.attribute.ModuleRequireInfo.of(ModuleRequireInfo.java:92)
at java.base/jdk.internal.classfile.impl.BoundAttribute$BoundModuleAttribute.structure(BoundAttribute.java:642)
at java.base/jdk.internal.classfile.impl.BoundAttribute$BoundModuleAttribute.requires(BoundAttribute.java:597)
at java.base/jdk.internal.module.ModuleInfoExtender.lambda$toByteArray$2(ModuleInfoExtender.java:192)
at java.base/jdk.internal.classfile.impl.TransformImpl.lambda$resolve$2(TransformImpl.java:70)
at java.base/jdk.internal.classfile.impl.ChainedClassBuilder.with(ChainedClassBuilder.java:52)
at java.base/jdk.internal.classfile.impl.ChainedClassBuilder.with(ChainedClassBuilder.java:35)
at java.base/java.lang.classfile.ClassTransform$2.accept(ClassTransform.java:85)
at java.base/java.lang.classfile.ClassTransform$2.accept(ClassTransform.java:80)
at java.base/jdk.internal.classfile.impl.TransformImpl.lambda$resolve$2(TransformImpl.java:70)
at java.base/jdk.internal.classfile.impl.ClassImpl.forEach(ClassImpl.java:173)
at java.base/java.lang.classfile.ClassFileBuilder.transform(ClassFileBuilder.java:88)
at java.base/jdk.internal.classfile.impl.ClassFileImpl$2.accept(ClassFileImpl.java:144)
at java.base/jdk.internal.classfile.impl.ClassFileImpl$2.accept(ClassFileImpl.java:139)
at java.base/jdk.internal.classfile.impl.ClassFileImpl.build(ClassFileImpl.java:129)
at java.base/jdk.internal.classfile.impl.ClassFileImpl.transformClass(ClassFileImpl.java:138)
at java.base/java.lang.classfile.ClassFile.transformClass(ClassFile.java:450)
at java.base/jdk.internal.module.ModuleInfoExtender.toByteArray(ModuleInfoExtender.java:156)
at jdk.jlink/jdk.tools.jmod.JmodTask$JmodFileWriter.writeModuleInfo(JmodTask.java:604)
at jdk.jlink/jdk.tools.jmod.JmodTask$JmodFileWriter.write(JmodTask.java:487)
at jdk.jlink/jdk.tools.jmod.JmodTask.create(JmodTask.java:444)
at jdk.jlink/jdk.tools.jmod.JmodTask.run(JmodTask.java:198)
at jdk.jlink/jdk.tools.jmod.Main.main(Main.java:35)
CreateJmods.gmk:251: recipe for target '/jdk-cf/build/macosx-aarch64/support/images/jmods/_create_jdk.jlink.jmod_exec.marker' failed
make[3]: *** [/jdk-repos/jdk-cf/build/macosx-aarch64/support/images/jmods/_create_jdk.jlink.jmod_exec.marker] Error 4
make/Main.gmk:397: recipe for target 'jdk.jlink-jmod' failed
make[2]: *** [jdk.jlink-jmod] Error 2
make[2]: *** Waiting for unfinished jobs....
ERROR: Build failed for targets 'jdk-image docs-jdk' in configuration 'macosx-aarch64' (exit code 2)
Stopping javac server
=== Output from failing command(s) repeated here ===
* For target support_images_jmods__create_jdk.jlink.jmod_exec:
Error: null
java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:220)
at java.base/java.lang.classfile.attribute.ModuleRequireInfo.of(ModuleRequireInfo.java:92)
at java.base/jdk.internal.classfile.impl.BoundAttribute$BoundModuleAttribute.structure(BoundAttribute.java:642)
at java.base/jdk.internal.classfile.impl.BoundAttribute$BoundModuleAttribute.requires(BoundAttribute.java:597)
at java.base/jdk.internal.module.ModuleInfoExtender.lambda$toByteArray$2(ModuleInfoExtender.java:192)
at java.base/jdk.internal.classfile.impl.TransformImpl.lambda$resolve$2(TransformImpl.java:70)
at java.base/jdk.internal.classfile.impl.ChainedClassBuilder.with(ChainedClassBuilder.java:52)
at java.base/jdk.internal.classfile.impl.ChainedClassBuilder.with(ChainedClassBuilder.java:35)
at java.base/java.lang.classfile.ClassTransform$2.accept(ClassTransform.java:85)
at java.base/java.lang.classfile.ClassTransform$2.accept(ClassTransform.java:80)
at java.base/jdk.internal.classfile.impl.TransformImpl.lambda$resolve$2(TransformImpl.java:70)
at java.base/jdk.internal.classfile.impl.ClassImpl.forEach(ClassImpl.java:173)
at java.base/java.lang.classfile.ClassFileBuilder.transform(ClassFileBuilder.java:88)
... (rest of output omitted)
javac -fullversion
javac full version "24-internal-2024-08-26-....
Description of the problem
While doing some work around ClassFile API, I ran into a NullPointerException after adding a null check to `ModuleRequireInfo of(ModuleEntry requires, int requiresFlags, Utf8Entry requiresVersion)` on `requiresVersion`
Github link: https://github.com/openjdk/jdk/blob/b840b130df7ccb64d4615460c0654a6315e9302f/src/java.base/share/classes/java/lang/classfile/attribute/ModuleRequireInfo.java#L89
The issue stems from BoundAttribute.java, where you find this piece of code
```
ModuleRequireInfo.of(classReader.readEntry(p, ModuleEntry.class),
classReader.readU2(p + 2),
classReader.readEntryOrNull(p + 4, Utf8Entry.class)
```
Github link: https://github.com/openjdk/jdk/blob/b840b130df7ccb64d4615460c0654a6315e9302f/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java#L644
`readEntryOrNull` is Optional and returns null
The build breaks after adding the null check with the following error
Creating jdk.jlink.jmod
Error: null
java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:220)
at java.base/java.lang.classfile.attribute.ModuleRequireInfo.of(ModuleRequireInfo.java:92)
at java.base/jdk.internal.classfile.impl.BoundAttribute$BoundModuleAttribute.structure(BoundAttribute.java:642)
at java.base/jdk.internal.classfile.impl.BoundAttribute$BoundModuleAttribute.requires(BoundAttribute.java:597)
at java.base/jdk.internal.module.ModuleInfoExtender.lambda$toByteArray$2(ModuleInfoExtender.java:192)
at java.base/jdk.internal.classfile.impl.TransformImpl.lambda$resolve$2(TransformImpl.java:70)
at java.base/jdk.internal.classfile.impl.ChainedClassBuilder.with(ChainedClassBuilder.java:52)
at java.base/jdk.internal.classfile.impl.ChainedClassBuilder.with(ChainedClassBuilder.java:35)
at java.base/java.lang.classfile.ClassTransform$2.accept(ClassTransform.java:85)
at java.base/java.lang.classfile.ClassTransform$2.accept(ClassTransform.java:80)
at java.base/jdk.internal.classfile.impl.TransformImpl.lambda$resolve$2(TransformImpl.java:70)
at java.base/jdk.internal.classfile.impl.ClassImpl.forEach(ClassImpl.java:173)
at java.base/java.lang.classfile.ClassFileBuilder.transform(ClassFileBuilder.java:88)
at java.base/jdk.internal.classfile.impl.ClassFileImpl$2.accept(ClassFileImpl.java:144)
at java.base/jdk.internal.classfile.impl.ClassFileImpl$2.accept(ClassFileImpl.java:139)
at java.base/jdk.internal.classfile.impl.ClassFileImpl.build(ClassFileImpl.java:129)
at java.base/jdk.internal.classfile.impl.ClassFileImpl.transformClass(ClassFileImpl.java:138)
at java.base/java.lang.classfile.ClassFile.transformClass(ClassFile.java:450)
at java.base/jdk.internal.module.ModuleInfoExtender.toByteArray(ModuleInfoExtender.java:156)
at jdk.jlink/jdk.tools.jmod.JmodTask$JmodFileWriter.writeModuleInfo(JmodTask.java:604)
at jdk.jlink/jdk.tools.jmod.JmodTask$JmodFileWriter.write(JmodTask.java:487)
at jdk.jlink/jdk.tools.jmod.JmodTask.create(JmodTask.java:444)
at jdk.jlink/jdk.tools.jmod.JmodTask.run(JmodTask.java:198)
at jdk.jlink/jdk.tools.jmod.Main.main(Main.java:35)
CreateJmods.gmk:251: recipe for target '/jdk-cf/build/macosx-aarch64/support/images/jmods/_create_jdk.jlink.jmod_exec.marker' failed
make[3]: *** [/jdk-repos/jdk-cf/build/macosx-aarch64/support/images/jmods/_create_jdk.jlink.jmod_exec.marker] Error 4
make/Main.gmk:397: recipe for target 'jdk.jlink-jmod' failed
make[2]: *** [jdk.jlink-jmod] Error 2
make[2]: *** Waiting for unfinished jobs....
ERROR: Build failed for targets 'jdk-image docs-jdk' in configuration 'macosx-aarch64' (exit code 2)
Stopping javac server
=== Output from failing command(s) repeated here ===
* For target support_images_jmods__create_jdk.jlink.jmod_exec:
Error: null
java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:220)
at java.base/java.lang.classfile.attribute.ModuleRequireInfo.of(ModuleRequireInfo.java:92)
at java.base/jdk.internal.classfile.impl.BoundAttribute$BoundModuleAttribute.structure(BoundAttribute.java:642)
at java.base/jdk.internal.classfile.impl.BoundAttribute$BoundModuleAttribute.requires(BoundAttribute.java:597)
at java.base/jdk.internal.module.ModuleInfoExtender.lambda$toByteArray$2(ModuleInfoExtender.java:192)
at java.base/jdk.internal.classfile.impl.TransformImpl.lambda$resolve$2(TransformImpl.java:70)
at java.base/jdk.internal.classfile.impl.ChainedClassBuilder.with(ChainedClassBuilder.java:52)
at java.base/jdk.internal.classfile.impl.ChainedClassBuilder.with(ChainedClassBuilder.java:35)
at java.base/java.lang.classfile.ClassTransform$2.accept(ClassTransform.java:85)
at java.base/java.lang.classfile.ClassTransform$2.accept(ClassTransform.java:80)
at java.base/jdk.internal.classfile.impl.TransformImpl.lambda$resolve$2(TransformImpl.java:70)
at java.base/jdk.internal.classfile.impl.ClassImpl.forEach(ClassImpl.java:173)
at java.base/java.lang.classfile.ClassFileBuilder.transform(ClassFileBuilder.java:88)
... (rest of output omitted)
- relates to
-
JDK-8317356 Fix missing null checks in the ClassFile API
-
- Resolved
-