Bug 67774

Summary: Nullpointer-exception in pointcuts using withincode() clause
Product: [Tools] AspectJ Reporter: Michael Moser <mmo>
Component: CompilerAssignee: Andrew Clement <aclement>
Status: RESOLVED FIXED QA Contact:
Severity: major    
Priority: P3 CC: hr_stoyanov
Version: 1.2   
Target Milestone: 1.2.1   
Hardware: PC   
OS: Windows XP   
Whiteboard:

Description Michael Moser CLA 2004-06-18 04:54:37 EDT
Hi,
I am getting null-pointer-exceptions whenever I try to specify a pointcut with 
a "withincode(Signature)" clause. E.g.:

public aspect DetectSystemOutErrorUsage 
{
pointcut allSystemOutAndSystemErrAccesses(): 
	(get(* System.out) || get(* System.err))
	;

declare warning: 
	allSystemOutAndSystemErrAccesses() 
	&& !adviceexecution()
	&& !within(com.tivoli.act..Test*)
	&& !within(com.tivoli.act.log..*)
	&& !execution(* com.tivoli.act..*.main(..))
	&& !execution(* com.tivoli.act..*.usage())
	// && !withincode(* com.tivoli.act..*.main(..))
	// && !withincode(* com.tivoli.act..*.usage())
	: "Warning: use of System.out or System.err - consider logging 
instead!";
}

In the above example excluding main() and usage() methods from the pointcut 
using an execution(...)-clause (shows) works but using a withincode()-clause 
(as commented) always yields an NPE:

trouble in:
null
java.lang.NullPointerException
        at org.aspectj.weaver.patterns.SignaturePattern.matches
(SignaturePattern.java:87)
        at org.aspectj.weaver.patterns.WithincodePointcut.match
(WithincodePointcut.java:42)
        at org.aspectj.weaver.patterns.NotPointcut.match(NotPointcut.java:45)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.ShadowMunger.match(ShadowMunger.java:62)
        at org.aspectj.weaver.Checker.match(Checker.java:48)
        at org.aspectj.weaver.bcel.BcelClassWeaver.match
(BcelClassWeaver.java:1121)
        at org.aspectj.weaver.bcel.BcelClassWeaver.matchInit
(BcelClassWeaver.java:895)
        at org.aspectj.weaver.bcel.BcelClassWeaver.match
(BcelClassWeaver.java:793)
        at org.aspectj.weaver.bcel.BcelClassWeaver.weave
(BcelClassWeaver.java:343)
        at org.aspectj.weaver.bcel.BcelClassWeaver.weave
(BcelClassWeaver.java:80)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:724)
        at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump
(BcelWeaver.java:689)
        at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify
(BcelWeaver.java:615)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:563)
        at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave
(AjCompilerAdapter.java:239)
        at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling
(AjCompilerAdapter.java:114)
        at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:376)
        at 
org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation
(AjBuildManager.java:601)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild
(AjBuildManager.java:160)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild
(AjBuildManager.java:94)
        at org.aspectj.ajde.internal.CompilerAdapter.compile
(CompilerAdapter.java:108)
        at org.aspectj.ajde.internal.AspectJBuildManager$CompilerThread.run
(AspectJBuildManager.java:165)
!SESSION Jun 18, 2004 10:49:48.666 ---------------------------------------------
eclipse.buildId=I200406110010
java.version=1.4.2_03
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_CH

!ENTRY org.eclipse.ajdt.ui 4 0 Jun 18, 2004 10:49:48.666
!MESSAGE NullPointerException thrown: null
!STACK 0
java.lang.NullPointerException
        at org.aspectj.weaver.patterns.SignaturePattern.matches
(SignaturePattern.java:87)
        at org.aspectj.weaver.patterns.WithincodePointcut.match
(WithincodePointcut.java:42)
        at org.aspectj.weaver.patterns.NotPointcut.match(NotPointcut.java:45)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42)
        at org.aspectj.weaver.ShadowMunger.match(ShadowMunger.java:62)
        at org.aspectj.weaver.Checker.match(Checker.java:48)
        at org.aspectj.weaver.bcel.BcelClassWeaver.match
(BcelClassWeaver.java:1121)
        at org.aspectj.weaver.bcel.BcelClassWeaver.matchInit
(BcelClassWeaver.java:895)
        at org.aspectj.weaver.bcel.BcelClassWeaver.match
(BcelClassWeaver.java:793)
        at org.aspectj.weaver.bcel.BcelClassWeaver.weave
(BcelClassWeaver.java:343)
        at org.aspectj.weaver.bcel.BcelClassWeaver.weave
(BcelClassWeaver.java:80)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:724)
        at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump
(BcelWeaver.java:689)
        at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify
(BcelWeaver.java:615)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:563)
        at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave
(AjCompilerAdapter.java:239)
        at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling
(AjCompilerAdapter.java:114)
        at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:376)
        at 
org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation
(AjBuildManager.java:601)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild
(AjBuildManager.java:160)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild
(AjBuildManager.java:94)
        at org.aspectj.ajde.internal.CompilerAdapter.compile
(CompilerAdapter.java:108)
        at org.aspectj.ajde.internal.AspectJBuildManager$CompilerThread.run
(AspectJBuildManager.java:165)


Michael
Comment 1 Andrew Clement CLA 2004-07-26 10:25:17 EDT
Thanks Michael for privately sending me your source... from all that source I've
finally recreated the problem with this tiny program:

aspect B {
  public A.new(String s) { }
  declare warning: withincode(void main(..)): "X";
}

class A {
  private final static String name = A.class.getName();
}

I suspected it was an initialization issue but I couldn't recreate it myself. 
Then I learned from your application that an ITD'd ctor was also in the mix.

Anyway, I'll now work on fixing it ...
Comment 2 Andrew Clement CLA 2004-07-28 12:20:54 EDT
*** Bug 65688 has been marked as a duplicate of this bug. ***
Comment 3 Andrew Clement CLA 2004-08-02 09:55:59 EDT
Ok.  The problem is to do with the preinitialization join point shadow not
correctly returning the right signature for the ctor that contains it.  It
returns null when asked 'where are you?' - which results in an NPE.  Although
the pointcuts we are discussing in this bug are looking for other shadows (not
in ctors), we still attempt to match against preinitialization shadows from ITDd
ctors.  The fix is to simply get it to return the signature for the ctor
containing it.

Fix checked in, waiting for build before closing this bug.
Comment 4 Andrew Clement CLA 2004-08-02 12:06:47 EDT
Fixed, available in dev build:

BUILD COMPLETE -  build.324
Date of build: 08/02/2004 15:14:37
Time to build: 100 minutes 0 seconds
Last changed: 08/02/2004 14:43:47
Last log entry: Fix for Bugzilla Bug 67774 Nullpointer-exception in pointcuts
using withincode() clause
Latest good AspectJ jar available at:
download.eclipse.org/technology/ajdt/dev/aspectj-DEVELOPMENT.jar
Comment 5 Adrian Colyer CLA 2004-10-21 04:32:23 EDT
Fix released as part of AspectJ 1.2.1