StackMapTable format error: bad type array size in method
Rafael Winterhalter
rafael.wth at gmail.com
Tue Aug 20 10:00:22 UTC 2024
I filed it here: https://bugs.openjdk.org/browse/JDK-8338661
Am Di., 20. Aug. 2024 um 11:32 Uhr schrieb Adam Sotona <
adam.sotona at oracle.com>:
> Hello,
>
> There is a problem in StackCounter calculation of maxLocals in combination
> with custom StackMapTableAttribute covering “dead code”.
>
>
>
> Feel free to report it as a bug or let me know and I’ll fill it.
>
>
>
> Thank you,
>
> Adam
>
>
>
> *From: *classfile-api-dev <classfile-api-dev-retn at openjdk.org> on behalf
> of Rafael Winterhalter <rafael.wth at gmail.com>
> *Date: *Monday, 19 August 2024 at 22:23
> *To: *classfile-api-dev <classfile-api-dev at openjdk.org>
> *Subject: *StackMapTable format error: bad type array size in method
>
> Hello,
>
> when testing some of the corner cases within the unit tests of Byte Buddy,
> I found some further errors when it comes to dead code and using
> ClassWriter. All those cases work when using ASM. As a reproducer, consider
> the following:
>
>
> ClassFile classFile = ClassFile.*of*(ClassFile.StackMapsOption.*DROP_STACK_MAPS*);
> byte[] bytes = classFile.build(ClassDesc.*of*("foo.Bar"), classBuilder -> classBuilder.withMethod(
> "foo",
> MethodTypeDesc.*ofDescriptor*("()J"),
> 0,
> methodBuilder -> {
> methodBuilder.withCode(codeBuilder -> {
> codeBuilder.new_(ClassDesc.*of*(RuntimeException.class.getName()));
> codeBuilder.dup();
> codeBuilder.invokespecial(ClassDesc.*of*(RuntimeException.class.getName()),
> "<init>",
> MethodTypeDesc.*ofDescriptor*("()V"));
> codeBuilder.athrow();
> Label f2 = codeBuilder.newBoundLabel();
> codeBuilder.lstore(1);
> Label f3 = codeBuilder.newBoundLabel();
> codeBuilder.lload(1);
> codeBuilder.lreturn();
> codeBuilder.with(StackMapTableAttribute.*of*(List.*of*(
> StackMapFrameInfo.*of*(f2,
> List.*of*(StackMapFrameInfo.ObjectVerificationTypeInfo.*of*(ClassDesc.*of*("foo.Bar"))),
> List.*of*(StackMapFrameInfo.SimpleVerificationTypeInfo.*ITEM_LONG*)),
> StackMapFrameInfo.*of*(f3,
> List.*of*(StackMapFrameInfo.ObjectVerificationTypeInfo.*of*(ClassDesc.*of*("foo.Bar")),
> StackMapFrameInfo.SimpleVerificationTypeInfo.*ITEM_LONG*),
> List.*of*())
> )));
> });
> }));
> new ClassLoader() {
> @Override
> protected Class<?> findClass(String name) throws ClassNotFoundException {
> if (name.equals("foo.Bar")) {
> return defineClass(name, bytes, 0, bytes.length);
> } else {
> return super.findClass(name);
> }
> }
> }.findClass("foo.Bar").getMethods();
>
> It gives a class format error. Java agents sometimes have to process all
> kinds of strange byte code, so ideally these cases should be supported. Is
> this a bug in the stack map frame attribute writer?
>
>
>
> Thanks! Rafael
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/classfile-api-dev/attachments/20240820/145f6e3f/attachment.htm>
More information about the classfile-api-dev
mailing list