Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] "java.lang.VerifyError: Bad <init> method call from after the start of a try block" with jdk_1.7.0_67

Glad we got you working, I wasn't confident that would address the verify error but luckily it did :)

I have, as you suggested, raised a bug describing the issue, mainly because in my humble opinion, the aspectj compiler should not produce bytecode that is considered invalid by the oracle JVM.

Absolutely right. It should not. Thanks for raising the issue.

cheers,
Andy


On 8 September 2014 00:09, <jochen.kohler@xxxxxx> wrote:
Hi Andy,

thanks for your answer - much appreciated !

Adding "&& execution(* *(..))" to my pointcut definition solves the VerifyError. I haven't completely verified, that the modification does not cause any undesired side effects on the business modules, but it looks promising.

Executing the unit test in my example project using aspectj 1.8.2 rather than 1.7.4 makes no difference - the VerifyError still exists. 

I have, as you suggested, raised a bug describing the issue, mainly because in my humble opinion, the aspectj compiler should not produce bytecode that is considered invalid by the oracle JVM. (https://bugs.eclipse.org/bugs/show_bug.cgi?id=443477).

Thanks for your Help !
Jochen

Jochen Kohler | Software Architect | Managed & Personalized HealthCare
InterComponentWare AG | Altrottstraße 31 | 69190 Walldorf (Baden) | Germany
Tel.: +49 (0) 6227 385 38 86 | Fax: +49 (0) 6227 385 471
jochen.kohler@xxxxxx | www.icw.de


-----aspectj-users-bounces@xxxxxxxxxxx wrote: -----
To: aspectj-users@xxxxxxxxxxx
From: Andy Clement
Sent by: aspectj-users-bounces@xxxxxxxxxxx
Date: 09/05/2014 06:25PM
Subject: Re: [aspectj-users] "java.lang.VerifyError: Bad <init> method call from after the start of a try block" with jdk_1.7.0_67


A quick observation, the use of cflow(within(...)) is going to advise a lot of places with calls to increment/decrement flow counters, perhaps too many. Do you think this variant would capture your intent?

 pointcut insideTrustedPackage(): 
        within(com.icw.ehf.aspectj.lab.service..*) && execution(* *(..));

​It would insert the counter inc/dec code in far fewer places.​ (maybe need a '|| staticinitialization()' bit in there too). I've seen this pattern before, and I wonder if really it is something we should fix inside AspectJ.

That said, it still may violate this JVM restriction.  Have you tried it with recent Java 8 builds, is it the same issue?

Please raise a bug against AspectJ - it'll take some thought to address this I think.

cheers,
Andy​

On 5 September 2014 06:45, <jochen.kohler@xxxxxx> wrote:
Hi AspectJ Users !

I encountered a strange problem with one of my existing aspects after updating to the latest Java 7 version (jdk 1.7.0_67). With this JDK, I receive a "java.lang.VerifyError: Bad <init> method call from after the start of a try block" when one of my instrumented classes is used.

The verification Error is produced by the following change in the JDK (http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/rev/458f18560343).

I created a small sample project which reproduces the problem and attached it to this eMail.
My production scenario is: Modify the result of a call to a particular object if the call originates from an untrusted package. 

Therefor, I created the following Aspect:

public aspect Experiment {
    pointcut insideTrustedPackage(): 
        within(com.icw.ehf.aspectj.lab.service..*);
    
    Object around(com.icw.ehf.aspectj.lab.pojo.SomePojo input): 
        !cflow(insideTrustedPackage()) && this(input) {
        System.out.println("from untrusted package " + thisJoinPoint.toString());
        return proceed(input);    
    }

}

If I use JDK version 1.7.0_55, everything works as expected. However, when using JDK 1.7.0_67, running the unit test in my example project results in the following VerifyError

java.lang.VerifyError: Bad <init> method call from after the start of a try block
Exception Details:
  Location:
    com/icw/ehf/aspectj/lab/service/SomeService.<init>()V @30: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0000000: 2ab2 002b b600 3000 a700 0e3a 0ab2 002b
    0000010: b600 3319 0abf 00b2 002b b600 3300 b700
    0000020: 09b2 002b b600 30b2 002b b600 30b2 002b
    0000030: b600 30b2 000b a700 0c4d b200 2bb6 0033
    0000040: 2cbf 00b2 002b b600 3300 1211 b200 2bb6
    0000050: 0030 b600 13a7 000e 3a04 b200 2bb6 0033
    0000060: 1904 bf00 b200 2bb6 0033 00a7 000e 3a06
    0000070: b200 2bb6 0033 1906 bfb2 002b b600 33a7
    0000080: 000e 3a08 b200 2bb6 0033 1908 bfb2 002b
    0000090: b600 33b1                              
  Exception Handler Table:
    bci [82, 85] => handler: 88
    bci [51, 54] => handler: 57
    bci [45, 110] => handler: 110
    bci [39, 130] => handler: 130
    bci [7, 8] => handler: 11
  Stackmap Table:
    same_locals_1_stack_item_frame(@11,Object[#57])
    same_locals_1_stack_item_frame(@22,UninitializedThis)
    full_frame(@57,{Object[#1]},{Object[#57]})
    same_locals_1_stack_item_frame(@66,Object[#20])
    same_locals_1_stack_item_frame(@88,Object[#57])
    same_frame(@99)
    same_locals_1_stack_item_frame(@110,Object[#57])
    same_frame(@121)
    same_locals_1_stack_item_frame(@130,Object[#57])
    same_frame(@141)

at com.icw.ehf.aspectj.lab.ExperimentAspectTest.test(ExperimentAspectTest.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
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.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.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

I disassembled the bytecode of the SomeService.class which I added to the very end of this eMail.
In this mnemonic representation of the bytecocde, I can see, that the actual .<init>() Method call is not the first Java statement in the constructor, which the comment in the JDK checkin indicates is no longer considered valid.

Unfortunately, I haven't found any useful information regarding this problem in the archives.

Has anybody already encountered this issue ?

Or even better, does anybody have a solution for me ?

Your help would be much appreciated !

Thanks in advance, 

Jochen Kohler | Software Architect | Managed & Personalized HealthCare
InterComponentWare AG | Altrottstraße 31 | 69190 Walldorf (Baden) | Germany
Tel.: +49 (0) 6227 385 38 86 | Fax: +49 (0) 6227 385 471
jochen.kohler@xxxxxx | www.icw.de

Disassembled ByteCode:
$ javap -c -s bin/com/icw/ehf/aspectj/lab/service/SomeService.class 
Compiled from "SomeService.java"
public class com.icw.ehf.aspectj.lab.service.SomeService {
  public com.icw.ehf.aspectj.lab.service.SomeService();
    Signature: ()V
    Code:
       0: aload_0       
       1: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
       4: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
       7: nop           
       8: goto          22
      11: astore        10
      13: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      16: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      19: aload         10
      21: athrow        
      22: nop           
      23: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      26: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      29: nop           
      30: invokespecial #9                  // Method java/lang/Object."<init>":()V
      33: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      36: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
      39: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      42: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
      45: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      48: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
      51: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
      54: goto          66
      57: astore_2      
      58: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      61: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      64: aload_2       
      65: athrow        
      66: nop           
      67: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      70: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      73: nop           
      74: ldc           #17                 // String Constructor SomeService
      76: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      79: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
      82: invokevirtual #19                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      85: goto          99
      88: astore        4
      90: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      93: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      96: aload         4
      98: athrow        
      99: nop           
     100: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
     103: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
     106: nop           
     107: goto          121
     110: astore        6
     112: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
     115: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
     118: aload         6
     120: athrow        
     121: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
     124: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
     127: goto          141
     130: astore        8
     132: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
     135: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
     138: aload         8
     140: athrow        
     141: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
     144: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
     147: return        
    Exception table:
       from    to  target type
          82    85    88   Class java/lang/Throwable
          51    54    57   Class java/lang/Throwable
          45   110   110   Class java/lang/Throwable
          39   130   130   Class java/lang/Throwable
           7     8    11   Class java/lang/Throwable

  public com.icw.ehf.aspectj.lab.pojo.SomePojo retreiveSomePojo();
    Signature: ()Lcom/icw/ehf/aspectj/lab/pojo/SomePojo;
    Code:
       0: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
       3: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
       6: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
       9: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
      12: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
      15: goto          27
      18: astore_2      
      19: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      22: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      25: aload_2       
      26: athrow        
      27: nop           
      28: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      31: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      34: nop           
      35: ldc           #31                 // String SomeService#retreiveSomePojo
      37: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      40: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
      43: invokevirtual #19                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      46: goto          60
      49: astore        4
      51: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      54: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      57: aload         4
      59: athrow        
      60: nop           
      61: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      64: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      67: nop           
      68: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      71: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
      74: new           #33                 // class com/icw/ehf/aspectj/lab/pojo/SomePojo
      77: dup           
      78: invokespecial #35                 // Method com/icw/ehf/aspectj/lab/pojo/SomePojo."<init>":()V
      81: goto          95
      84: astore        6
      86: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      89: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      92: aload         6
      94: athrow        
      95: nop           
      96: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      99: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
     102: nop           
     103: astore        9
     105: goto          119
     108: astore        8
     110: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
     113: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
     116: aload         8
     118: athrow        
     119: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
     122: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
     125: aload         9
     127: areturn       
    Exception table:
       from    to  target type
          74    81    84   Class java/lang/Throwable
          43    46    49   Class java/lang/Throwable
          12    15    18   Class java/lang/Throwable
           6   108   108   Class java/lang/Throwable

  static {};
    Signature: ()V
    Code:
       0: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
       3: invokevirtual #48                 // Method org/aspectj/runtime/internal/CFlowCounter.inc:()V
       6: goto          31
       9: astore_1      
      10: aload_1       
      11: instanceof    #53                 // class java/lang/ExceptionInInitializerError
      14: ifeq          22
      17: aload_1       
      18: checkcast     #53                 // class java/lang/ExceptionInInitializerError
      21: athrow        
      22: nop           
      23: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      26: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      29: aload_1       
      30: athrow        
      31: getstatic     #43                 // Field Experiment.ajc$cflowCounter$0:Lorg/aspectj/runtime/internal/CFlowCounter;
      34: invokevirtual #51                 // Method org/aspectj/runtime/internal/CFlowCounter.dec:()V
      37: return        
    Exception table:
       from    to  target type
           6     9     9   Class java/lang/Throwable
}


InterComponentWare AG:
Vorstand: Peter Kirschbauer (Vors.), Matthias Glück
Aufsichtsratsvors.: Prof. Dr. Christof Hettich
Firmensitz: 69190 Walldorf, Altrottstraße 31
AG Mannheim HRB 351761 / USt.-IdNr.: DE 198388516
  Follow @icwinc on Twitter  InterComponentWare AG  InterComponentWare AG

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users

InterComponentWare AG:
Vorstand: Peter Kirschbauer (Vors.), Matthias Glück
Aufsichtsratsvors.: Prof. Dr. Christof Hettich
Firmensitz: 69190 Walldorf, Altrottstraße 31
AG Mannheim HRB 351761 / USt.-IdNr.: DE 198388516
  Follow @icwinc on Twitter  InterComponentWare AG  InterComponentWare AG

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top