[PATCH] JDK-8159797 Throw a right IllegalArgumentException from the bytecode generated by Method/ConstructorAccessor
Jaikiran Pai
jai.forums2013 at gmail.com
Fri May 11 03:21:39 UTC 2018
Any reviews/sponsors please?
-Jaikiran
On 03/05/18 6:24 PM, Jaikiran Pai wrote:
> Hi,
>
> This mail contains a potential patch to the issue[1] that I had
> reported a couple of years back. The issue is still valid and
> reproducible with latest upstream JDK.
>
> In brief, if a certain code has:
>
> public void doSomething(String foo) {...}
>
> and then it gets invoked through reflection:
>
> thatMethod = // get hold of that method through reflection
>
> thatMethod.invoke(validObjectInstance, null);
>
> then as per the javadoc of the Method#invoke[2] you would expect an
> IllegalArgumentException (since the method expects 1 parameter and we
> are sending none). This does throw an IllegalArgumentException, but
> when the invocation happens through a (dynamically generated)
> MethodAccessor, instead of a native MethodAccessor, the
> IllegalArgumentException that gets thrown is due to a NPE that happens
> and the NPE's toString() output is contained as a message of the
> IllegalArgumentException, as noted in the JIRA. This happens even for
> Constructor invocations, through ConstructorAccessor.
>
> The commit in the attached patch, adds bytecode instructions to check
> if the method arguments being passed is null and if so, doesn't
> attempt an arraylength instruction and instead just stores 0 on to the
> stack. This prevents the NullPointerException being reported, enclosed
> as a message within the IllegalArgumentException and instead throws
> back a proper IllegalArgumentException (as you would expect if the
> invocation had happened over a native MethodAccessor).
>
> The goal of the patch _isn't_ to match the exception message with what
> the native MethodAccessor throws but just prevent the NPE from being
> playing a role in the IllegalArgumentException. i.e. this change
> _doesn't_ throw a new IllegalArgumentException("wrong number of
> arguments").
>
> The patch also contains a new testcase which reproduces this against
> the current upstream and verifies this patch works.
>
> This is the first time I'm fiddling with bytecode generation, so I
> would appreciate some feedback on the changed bytecode and if there's
> a different/better way to do it. Furthermore, although I do have a
> signed and approved OCA, I will need a sponsor for this patch. Anyone
> willing to review and sponsor, please?
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8159797
>
> [2]
> https://docs.oracle.com/javase/10/docs/api/java/lang/reflect/Method.html#invoke(java.lang.Object,java.lang.Object...)
>
> -Jaikiran
>
More information about the core-libs-dev
mailing list