Skip to content

NPE in FindReturnRef.isNestedField(FindReturnRef.java:318) #3283

@iloveeclipse

Description

@iloveeclipse

Using latest SpotBugs build from master 4.9.1.202501291911-e8021d1 on Eclipse SDK code I've found yet another regression in 4.9.0.

The error is reported while analyzing https://github.com/eclipse-jdt/eclipse.jdt.ui/blob/28604fa1b4e9060c7b55c03e3ce18fc109b73b4a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/FilteredPreferenceTree.java#L79

eclipse.buildId=4.35.0.I20250129-1800
java.version=21.0.2-13
java.vendor=N/A
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -os linux -ws gtk -arch x86_64 -data /data/4x_platform_workspace

com.github.spotbugs.plugin.eclipse
Error
Thu Jan 30 08:09:16 CET 2025
Exception analyzing org.eclipse.jdt.internal.ui.preferences.FilteredPreferenceTree$PreferenceTreeNode using detector edu.umd.cs.findbugs.detect.FindReturnRef

java.lang.NullPointerException: Cannot invoke "edu.umd.cs.findbugs.ba.XField.getName()" because "field" is null
	at edu.umd.cs.findbugs.detect.FindReturnRef.isNestedField(FindReturnRef.java:318)
	at edu.umd.cs.findbugs.detect.FindReturnRef.sawOpcode(FindReturnRef.java:204)
	at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:884)
	at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:218)
	at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:251)
	at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:65)
	at org.apache.bcel.classfile.Code.accept(Code.java:145)
	at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:323)
	at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:405)
	at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:249)
	at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:38)
	at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:76)
	at edu.umd.cs.findbugs.FindBugs2.lambda$analyzeApplication$1(FindBugs2.java:1100)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at edu.umd.cs.findbugs.CurrentThreadExecutorService.execute(CurrentThreadExecutorService.java:86)
	at java.base/java.util.concurrent.AbstractExecutorService.invokeAll(AbstractExecutorService.java:247)
	at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1110)
	at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:309)
	at de.tobject.findbugs.builder.FindBugsWorker.runFindBugs(FindBugsWorker.java:314)
	at de.tobject.findbugs.builder.FindBugsWorker.work(FindBugsWorker.java:220)
	at de.tobject.findbugs.actions.FindBugsAction$StartedFromViewJob.runWithProgress(FindBugsAction.java:274)
	at de.tobject.findbugs.FindBugsJob.run(FindBugsJob.java:141)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

The line with NPE was changed in d37c057 / #3174.

The fix would be trivial:

diff --git a/spotbugs/src/main/java/edu/umd/cs/findbugs/detect/FindReturnRef.java b/spotbugs/src/main/java/edu/umd/cs/findbugs/detect/FindReturnRef.java
index 4960bd2..ef3a023 100644
--- a/spotbugs/src/main/java/edu/umd/cs/findbugs/detect/FindReturnRef.java
+++ b/spotbugs/src/main/java/edu/umd/cs/findbugs/detect/FindReturnRef.java
@@ -317,3 +317,3 @@
     private boolean isNestedField(XField field) {
-        if (getThisClass().isNested() && field.getName().startsWith("this$")) {
+        if (field != null && getThisClass().isNested() && field.getName().startsWith("this$")) {
             try {

I see this stack state while debugging the NPE:

Image

The method we analyze is public void addChild(org.eclipse.jdt.internal.ui.preferences.FilteredPreferenceTree$PreferenceTreeNode node) [Signature: (Lorg/eclipse/jdt/internal/ui/preferences/FilteredPreferenceTree$PreferenceTreeNode<*>;)V]

Code:

https://github.com/eclipse-jdt/eclipse.jdt.ui/blob/28604fa1b4e9060c7b55c03e3ce18fc109b73b4a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/FilteredPreferenceTree.java#L158-L163

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions