On Mon, 12 Aug 2024 17:23:15 GMT, Nizar Benalla <nbena...@openjdk.org> wrote:

> The test is inspired from [FFM API's 
> TestNulls](https://github.com/openjdk/jdk/blob/master/test/jdk/java/foreign/TestNulls.java),
>  I customized their Null checking framework it to work with ClassFile API.
> 
> The framework for for testing an API in bulk, so that all methods are 
> reflectively called with some values replaced with nulls, so that all 
> combinations are tried.
> 
> This test reveals some inconsistencies in the ClassFile API, whether it's a 
> method with nullable arguments`[1]`, nulls are passed to`[2]` or its 
> implementation handles nulls `[3]` `[4]`.
> 
> 
> `[1]:` 
> [ModuleRequireInfo#of](https://github.com/openjdk/jdk/blob/25e03b52094f46f89f2fe8f20e7e5622928add5f/src/java.base/share/classes/java/lang/classfile/attribute/ModuleRequireInfo.java#L89)
> `[2]:` 
> [Signature$ClassTypeSig#of](https://github.com/openjdk/jdk/blob/7ad61605f1669f51a97f4f263a7afaa9ab7706be/src/java.base/share/classes/java/lang/classfile/Signature.java#L150)
> `[3]:`  
> [CatchBuilderImpl#catching](https://github.com/openjdk/jdk/blob/7ad61605f1669f51a97f4f263a7afaa9ab7706be/src/java.base/share/classes/jdk/internal/classfile/impl/CatchBuilderImpl.java#L55)
> `[4]:` 
> [CodeBuilder#loadConstant](https://github.com/openjdk/jdk/blob/7ad61605f1669f51a97f4f263a7afaa9ab7706be/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java#L615)
> 
> 
> 
> `test/jdk/jdk/classfile/TestNullHostile.java#EXCLUDE_LIST` has the list of 
> methods that are still not null hostile, they are ignored by the test, as 
> making them null hostile either breaks some tests (listed below) or breaks 
> the build with a `NullPointerException` or `BootstapMethodError`. I will 
> paste the relevant methods from that list here.
> 
> Tests broken by these methods are :
> 
> 
> jdk/classfile/VerifierSelfTest.java
> jdk/classfile/TestRecordComponent.java
> jdk/classfile/TestNullHostile.java    
> jdk/classfile/OpcodesValidationTest.java
> jdk/classfile/ClassPrinterTest.java
> java/lang/invoke/MethodHandlesGeneralTest.java        
> java/lang/invoke/MethodHandleProxies/WrapperHiddenClassTest.java
> java/lang/invoke/MethodHandleProxies/WithSecurityManagerTest.java     
> java/lang/invoke/MethodHandleProxies/BasicTest.java
> 
> 
> Full list of methods
> 
> 
> //the implementation of this method in CatchBuilderImpl handles nulls, is 
> this fine?
> "java.lang.classfile.CodeBuilder$CatchBuilder/catching(java.lang.constant.ClassDesc,java.util.function.Consumer)/0/0",
> 
> // making this method null-hostile causes a BootstapMethodError during the 
> the build
> //        java.lang.BootstrapMethodError: bootstrap method initiali...

**Edit: the entire list has now been checked**

I now have some tests that pick up on the bug in `Utf8Entry::equalsString`.
I have added `Objects::requireNonNull` in a few places, will do an other scan 
when I'm done to remove a few that may be redundant, as the null check is 
sometimes implicit.
Classes/Interfaces that I haven't tested yet are the following 

AttributeMapper
AttributeMapper.AttributeStability
BufWriter
ClassBuilder
ClassFileElement
ClassFileTransform
ClassHierarchyResolver.ClassHierarchyInfo
ClassModel
ClassReader
ClassSignature
ClassTransform
CodeBuilder
CodeBuilder.CatchBuilder
CodeBuilder.BlockCodeBuilder
CodeElement
CodeTransform
CompoundElement
FieldBuilder
FieldTransform
MethodBuilder
MethodElement
MethodSignature
MethodTransform
Opcode
Opcode.Kind
Signature.ArrayTypeSig
Signature.BaseTypeSig
Signature.TypeArg
Signature.TypeArg.Bounded
Signature.TypeArg.Bounded.WildcardIndicator
Signature.TypeArg.Unbounded
Signature.ClassTypeSig
Signature.ThrowableSig
Signature.TypeParam
Signature.TypeVarSig
Signature.RefTypeSig
TypeAnnotation.TargetInfo
TypeAnnotation.TypePathComponent
TypeAnnotation.TypePathComponent.Kind
TypeAnnotation.TypeArgumentTarget
TypeAnnotation.OffsetTarget
TypeAnnotation.CatchTarget
TypeAnnotation.LocalVarTargetInfo
TypeAnnotation.LocalVarTarget
TypeAnnotation.ThrowsTarget
TypeAnnotation.FormalParameterTarget
TypeAnnotation.EmptyTarget
TypeAnnotation.TypeParameterBoundTarget
TypeAnnotation.SupertypeTarget
TypeAnnotation.TypeParameterTarget
TypeAnnotation.TargetType
AnnotationDefaultAttribute
BootstrapMethodsAttribute
ModuleAttribute.ModuleAttributeBuilder
ModuleExportInfo
ModuleHashInfo
ModuleHashesAttribute
ModuleMainClassAttribute
ModuleOpenInfo
ModulePackagesAttribute
ModuleProvideInfo
ModuleRequireInfo
ModuleResolutionAttribute
ModuleTargetAttribute
ClassPrinter.MapNode
ClassPrinter.ListNode
ClassPrinter.LeafNode
ClassPrinter.Node
ClassRemapper
CodeLocalsShifter
CodeRelabeler

Thanks for keeping track of this PR, I will do one more push tomorrow and open 
it.

I shaved 500 lines from the test I was using, I can probably make it more 
concise with more time.

Adding null checks breaks some tests (sometimes even the build), some are 
method handles related but the rest are limited to CF. 

I have filed [JDK-8339344](https://bugs.openjdk.org/browse/JDK-8339344) but 
more Bugs/RFEs will need to be filed.

I will modify the PR's body with some questions on which methods can be added 
to `TestNullHostile##EXCLUDE_LIST` and which need to be updated.

Also, I noticed a recent push (#20779) removing 
`CodeBuilder.loadConstant(Opcode, ConstantDesc)` which had been a major source 
of pain today. Will merge in a bit.

An other want I want to discuss is CodeBuilder.loadConstant(ConstantDesc value).

It [handles nulls 
](https://github.com/openjdk/jdk/blob/ad40a122d632d65052b71125c0dfd58c54e3a521/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java#L614),
 and adding a null check causes a `BootstrapMethodError` during the build

-------------

PR Comment: https://git.openjdk.org/jdk/pull/20556#issuecomment-2321858976
PR Comment: https://git.openjdk.org/jdk/pull/20556#issuecomment-2325417395
PR Comment: https://git.openjdk.org/jdk/pull/20556#issuecomment-2326579191
PR Comment: https://git.openjdk.org/jdk/pull/20556#issuecomment-2326627971

Reply via email to