NullPointer in Sonar while developing custom cobol Rule

Hello

I’ve developed a custom COBOL rule for the company i work for. We are using sonarqube enterprise. I used the COBOL custom rules project from GitHub as a basis.

    <sonar.version>8.2.0.32929</sonar.version>
    <sonarcobol.version>4.4.0.3403</sonarcobol.version>

The example unit tests run just fine, but when I run my test, I get the following NullPointerException coming from inside the Sonar code. I’m extending the class CobolCheck. As there is no javadoc or sourcecode availble it is hard to figure out what went wrong

java.lang.NullPointerException
	at com.sonarsource.cobol.E.H.D(Unknown Source)
	at com.sonarsource.cobol.E.I.A(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
	at com.sonarsource.cobol.E.I.B(Unknown Source)
	at com.sonarsource.cobol.squid.CobolAstScanner.A(Unknown Source)
	at com.sonarsource.cobol.squid.CobolAstScanner.scanFiles(Unknown Source)
	at com.sonarsource.cobol.squid.CobolAstScanner.scanTestFiles(Unknown Source)
	at com.sonarsource.cobol.testing.checks.CobolCheckVerifier.A(Unknown Source)
	at com.sonarsource.cobol.testing.checks.CobolCheckVerifier.createVerifier(Unknown Source)
	at com.sonarsource.cobol.testing.checks.CobolCheckVerifier.verify(Unknown Source)
	at com.mycompany.cobol.sample.checks.IFlRuleTest.testVisitNode(IFlRuleTest.java:26)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:93)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:530)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:758)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:453)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:211)

Hello Daniel Stein,

my apologies for the late reply!

I believe this exception might be occurring because an issue is being reported without a location.
Can you make sure that if you call reportIssue(...) that you also add some location information? This can be done with multiple builder methods (on(Token), on(AstNode), etc. See this builder interface).

Some of the examples also showcase the usage of these builder methods, see for example here.

I’ll also create an internal ticket to improve the messaging around this exception to make cases like this easier to debug.

Please let me know, if this resolved your problem!

Best regards,

Anton

2 Likes

Hello Anton,

thanks for your reply. Your suggestion was correct. Now the NPE is gone and everything works.

3 Likes