Skip to content

stackmap verifyError when using powermock rule #543

@johanhaleby

Description

@johanhaleby

From bbaetz@gmail.com on October 22, 2014 16:23:00

Not sure if this is a javassist bug or a powermock one. (or a JVM bug)

I'm running the latest JVM, that has fixed the other VerifyError error ( https://bugs.openjdk.java.net/browse/JDK-8051012 ) What steps will reproduce the problem? 1. The attached test file causes a stackmap error

java.lang.VerifyError: Expecting a stackmap frame at branch target 11

It shouldn't What is the expected output? What do you see instead? testStackmapBug(stackmapbug.StackmapTest) Time elapsed: 0.107 sec <<< ERROR!
java.lang.VerifyError: Expecting a stackmap frame at branch target 11
Exception Details:
Location:
stackmapbug/StackmapTest$breaksStuff.breaks()V @8: if_acmpeq
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: 2ab6 001a 2ab6 001a a500 03b1

at stackmapbug.StackmapTest.testStackmapBug(StackmapTest.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.powermock.modules.junit4.rule.PowerMockStatement.evaluate( PowerMockRule .java:63)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) What version of the product are you using? On what operating system? powermock 1.5.6

linux (fedora 20), with:

java version "1.7.0_71"
OpenJDK Runtime Environment (fedora-2.5.3.0.fc20-x86_64 u71-b14)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

and

openjdk version "1.8.0_25"
OpenJDK Runtime Environment (build 1.8.0_25-b18)
OpenJDK 64-Bit Server VM (build 25.25-b02, mixed mode)

These java versions are meant to have the fix for https://bugs.openjdk.java.net/browse/JDK-8051012 JDK8 breaks regardless of whether I compile for -target 1.7 or 1.8 Please provide any additional information below. The trigger seems to be the instantiation of the separate class that uses != on two objects within an if statement (the original scenario has this in a .equals method)

using toString() instead of getClass() triggers the same problem, but "foo" != "foo" doesn't.

It has to be in a separate class; putting the condition into the @test method doesn't cause an issue.

The inner class doesn't make a difference; it was just easier to put everything in the one file to reproduce.

-noverify works around this https://github.com/bbaetz/stackmapbug has a full project/pom/etc - just run 'mvn test'

Attachment: StackmapTest.java

Original issue: http://code.google.com/p/powermock/issues/detail?id=523

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions