<div dir="ltr"><div>Here is a simple reproducer of this:</div><div><div style="background-color:rgb(30,31,34);color:rgb(188,190,196)"><pre style="font-family:"JetBrains Mono",monospace;font-size:9.8pt"><br> ClassFile classFile = ClassFile.<span style="font-style:italic">of</span>(ClassFile.StackMapsOption.<span style="color:rgb(199,125,187);font-style:italic">DROP_STACK_MAPS</span>);<br> <span style="color:rgb(207,142,109)">byte</span>[] bytes = classFile.build(ClassDesc.<span style="font-style:italic">of</span>(<span style="color:rgb(106,171,115)">"foo.Bar"</span>), classBuilder -> classBuilder.withMethod(<br> <span style="color:rgb(106,171,115)">"foo"</span>,<br> MethodTypeDesc.<span style="font-style:italic">ofDescriptor</span>(<span style="color:rgb(106,171,115)">"()Ljava/lang/Object;"</span>),<br> <span style="color:rgb(42,172,184)">0</span>,<br> methodBuilder -> {<br> methodBuilder.withCode(codeBuilder -> {<br> codeBuilder.ldc(<span style="color:rgb(106,171,115)">"x"</span>);<br> codeBuilder.areturn();<br> Label label = codeBuilder.newBoundLabel();<br> codeBuilder.ldc(<span style="color:rgb(106,171,115)">"x"</span>);<br> codeBuilder.ldc(<span style="color:rgb(106,171,115)">"x"</span>);<br> codeBuilder.areturn();<br> codeBuilder.with(StackMapTableAttribute.<span style="font-style:italic">of</span>(List.<span style="font-style:italic">of</span>(<br> StackMapFrameInfo.<span style="font-style:italic">of</span>(label,<br> List.<span style="font-style:italic">of</span>(StackMapFrameInfo.ObjectVerificationTypeInfo.<span style="font-style:italic">of</span>(ClassDesc.<span style="font-style:italic">of</span>(<span style="color:rgb(106,171,115)">"foo.Bar"</span>))),<br> List.<span style="font-style:italic">of</span>()))));<br> });<br> }));<br> <span style="color:rgb(207,142,109)">new </span>ClassLoader() {<br> <span style="color:rgb(179,174,96)">@Override<br></span><span style="color:rgb(179,174,96)"> </span><span style="color:rgb(207,142,109)">protected </span>Class<?> <span style="color:rgb(86,168,245)">findClass</span>(String name) <span style="color:rgb(207,142,109)">throws </span>ClassNotFoundException {<br> <span style="color:rgb(207,142,109)">if </span>(name.equals(<span style="color:rgb(106,171,115)">"foo.Bar"</span>)) {<br> <span style="color:rgb(207,142,109)">return </span>defineClass(name, <span style="color:rgb(199,125,187)">bytes</span>, <span style="color:rgb(42,172,184)">0</span>, <span style="color:rgb(199,125,187)">bytes</span>.<span style="color:rgb(199,125,187)">length</span>);<br> } <span style="color:rgb(207,142,109)">else </span>{<br> <span style="color:rgb(207,142,109)">return super</span>.findClass(name);<br> }<br> }<br> }.findClass(<span style="color:rgb(106,171,115)">"foo.Bar"</span>).getMethods();</pre></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Mo., 19. Aug. 2024 um 20:05 Uhr schrieb Rafael Winterhalter <<a href="mailto:rafael.wth@gmail.com">rafael.wth@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hello,</div><div><br></div><div>this is tested with a recent 24 EA.<br></div><div><br></div><div>I discovered that some generated classes in Byte Buddy fail to verify with: Operand stack overflow - Exceeded stack size. This seems to happen when adding dead code, even if frames are created manually. For example, if I use the class file API to create the following method, I'd create the above verify error:<br></div><div><br></div><div>String m() {<br></div><div> LDC "x"</div><div> ARETURN</div><div> F_SAME<br></div><div><div><div> LDC "x"</div></div><div> LDC "x"</div><div> ARETURN</div><div>}</div><div><br></div><div>This code might appear meaningless, but there are a bunch of code generators that create such weird code, that is why Byte Buddy supports it. It seems like the class file API computes the required stack size at 1, not as 2. Currently, I cannot override this.</div><div><br></div><div>If this class is picked up by a Java agent and simply passed and returned, the max size will therefore decrease and the verification error will surface.</div><div><br></div><div>Best regards, Rafael<br></div></div></div>
</blockquote></div>