commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Pietro Ferrara (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (BCEL-289) Crash when parsing constructor of inner classes with parameters annotated
Date Wed, 17 May 2017 08:04:05 GMT

    [ https://issues.apache.org/jira/browse/BCEL-289?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16013696#comment-16013696
] 

Pietro Ferrara commented on BCEL-289:
-------------------------------------

As far as I can understand (I'm debugging with the code of release 6.0), it seems that there
is a problem with the syntetic parameter of the inner constructor: at bytecode level, the
signature of the constructor is:
{code:java}
public void <init>(Test arg0, Object arg1, Object arg2) 
{code}

The code raising the exception is the first line of the following for loop:

{code:java}
for (int j = 0; j < arg_types.length; j++) {
  // This returns Annotation[] ...
  final ParameterAnnotationEntry immutableArray = rpa
  .getParameterAnnotationEntries()[j];
  // ... which needs transforming into an AnnotationGen[] ...
  final List<AnnotationEntryGen> mutable = makeMutableVersion(immutableArray.getAnnotationEntries());
  // ... then add these to any we already know about
  param_annotations[j].addAll(mutable);
 }
{code}

When I debug class MethodGen just before the exception is raisen, I see that:
- arg_types is:
{noformat}
[Test, java.lang.Object, java.lang.Object]
{noformat}
- rpa.parameter_annotation_table (returned by getParameterAnnotationEntries) is:
{noformat}
[@LA;, @LB;]
{noformat}

It looks like when rpa (RuntimeVisibleParameterAnnotations) is built it does not take into
account the syntectic parameter.

rpa comes from the field attribute_vect. If you don't have any annotation on parameters, I
expect attribute_vect to be an empty collection, so the body of the for loop wrapping the
code crashing is never executed.

Hope this helps!

> Crash when parsing constructor of inner classes with parameters annotated
> -------------------------------------------------------------------------
>
>                 Key: BCEL-289
>                 URL: https://issues.apache.org/jira/browse/BCEL-289
>             Project: Commons BCEL
>          Issue Type: Bug
>          Components: Parser
>    Affects Versions: 6.0
>            Reporter: Pietro Ferrara
>            Priority: Critical
>             Fix For: 6.1
>
>
> BCEL crashes when parsing the constructor of an inner class whose parameters are annotated.
For instance, when parsing the jar obtained from the following classes:
> {code:java}
> public @interface A {}
> public @interface B {}
> public class Test {
>     public class Inner {
> 	public Inner(@A Object a, @B Object b) {}
>     }
> }
> {code}
> In particular:
> {code:java}
> 		ClassParser cp = new ClassParser(args[0]);
> 		ClassGen cg = new ClassGen(cp.parse());
> 		MethodGen mg = new MethodGen(cg.getMethodAt(0), cg.getClassName(), cg.getConstantPool());
> 		mg.getAnnotationsOnParameter(0);
> {code}
> (where args\[0\] points to Test$Inner.class)
> you get
> {noformat}
> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
> 	at org.apache.bcel.generic.MethodGen.ensureExistingParameterAnnotationsUnpacked(MethodGen.java:1120)
> 	at org.apache.bcel.generic.MethodGen.getAnnotationsOnParameter(MethodGen.java:1073)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Mime
View raw message