SonarJava Error with Optional<Timestamp>

39 views
Skip to first unread message

Huan Ruan

unread,
Aug 8, 2017, 1:35:32 AM8/8/17
to SonarQube
Hi 

I encountered an error with SonarJava analysis. I've narrowed the code down as much as I can to the following reproducible test case. Please can you take a look?

Thanks
Huan

Environment

SonarQube 6.0; SonarQube Scanner 3.0.3.778; SonarJava 4.12.0.11033; Java 1.8.0_121 Oracle Corporation (64-bit); Linux 3.10.0-327.el7.x86_64 amd64

cat /tmp/Test.java

import java.util.Optional;
import java.sql.Timestamp;

public class Test{
  public static void main(String[] args){
    // Sonar errors on this.
    ((Optional<Timestamp>)null).map(value -> 1);

    // Just changing <Timestamp> to <String> works;
    // ((Optional<String>)null).map(value -> 1);

    // Or, just changing lambda inside map() to null works too.
    // ((Optional<Timestamp>)null).map(null);
  }
}

cat test.properties
sonar.projectKey=test
sonar.projectName=test
sonar.projectVersion=1.0
sonar.projectBaseDir=/tmp
sonar.sources=.
sonar.inclusions=*.java
sonar.java.source=1.8
sonar.java.binaries=/tmp/Test.class

Run

sonar-scanner -X -Dproject.settings=./test.properties 

Error

org.sonar.squidbridge.api.AnalysisException: SonarQube is unable to analyze file : '/tmp/Test.java'
        at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:105)
        at org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:68)
        at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:119)
        at org.sonar.java.JavaSquid.scan(JavaSquid.java:113)
        at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:84)
        at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:53)
        at org.sonar.scanner.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:57)
        at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:49)
        at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:78)
        at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:184)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
        at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:241)
        at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:236)
        at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:226)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
        at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:47)
        at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:86)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
        at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:115)
        at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:118)
        at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:63)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
        at com.sun.proxy.$Proxy0.execute(Unknown Source)
        at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:233)
        at org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis(EmbeddedScanner.java:151)
        at org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:123)
        at org.sonarsource.scanner.cli.Main.execute(Main.java:77)
        at org.sonarsource.scanner.cli.Main.main(Main.java:61)
Caused by: java.lang.NullPointerException
        at org.sonar.java.AnalyzerMessage.textSpanBetween(AnalyzerMessage.java:136)
        at org.sonar.java.AnalyzerMessage.textSpanFor(AnalyzerMessage.java:125)
        at org.sonar.java.model.DefaultJavaFileScannerContext.createAnalyzerMessage(DefaultJavaFileScannerContext.java:161)
        at org.sonar.java.model.DefaultJavaFileScannerContext.reportIssueWithFlow(DefaultJavaFileScannerContext.java:135)
        at org.sonar.java.model.DefaultJavaFileScannerContext.reportIssue(DefaultJavaFileScannerContext.java:123)
        at org.sonar.java.model.DefaultJavaFileScannerContext.reportIssue(DefaultJavaFileScannerContext.java:117)
        at org.sonar.java.checks.DisallowedClassCheck.checkIfDisallowed(DisallowedClassCheck.java:101)
        at org.sonar.java.checks.DisallowedClassCheck.visitVariable(DisallowedClassCheck.java:59)
        at org.sonar.java.model.declaration.VariableTreeImpl.accept(VariableTreeImpl.java:184)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:37)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitLambdaExpression(BaseTreeVisitor.java:343)
        at org.sonar.java.model.expression.LambdaExpressionTreeImpl.accept(LambdaExpressionTreeImpl.java:91)
        at org.sonar.java.ast.parser.ListTreeImpl.accept(ListTreeImpl.java:63)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:48)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitMethodInvocation(BaseTreeVisitor.java:253)
        at org.sonar.java.model.expression.MethodInvocationTreeImpl.accept(MethodInvocationTreeImpl.java:96)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitExpressionStatement(BaseTreeVisitor.java:102)
        at org.sonar.java.model.statement.ExpressionStatementTreeImpl.accept(ExpressionStatementTreeImpl.java:65)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:37)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBlock(BaseTreeVisitor.java:86)
        at org.sonar.java.model.statement.BlockTreeImpl.accept(BlockTreeImpl.java:77)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitMethod(BaseTreeVisitor.java:81)
        at org.sonar.java.checks.DisallowedClassCheck.visitMethod(DisallowedClassCheck.java:69)
        at org.sonar.java.model.declaration.MethodTreeImpl.accept(MethodTreeImpl.java:218)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:37)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitClass(BaseTreeVisitor.java:70)
        at org.sonar.java.checks.DisallowedClassCheck.visitClass(DisallowedClassCheck.java:89)
        at org.sonar.java.model.declaration.ClassTreeImpl.accept(ClassTreeImpl.java:202)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:37)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitCompilationUnit(BaseTreeVisitor.java:55)
        at org.sonar.java.model.JavaTree$CompilationUnitTreeImpl.accept(JavaTree.java:189)
        at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
        at org.sonar.java.checks.DisallowedClassCheck.scanFile(DisallowedClassCheck.java:52)
        at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:117)
        at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:96)
        ... 34 more

Huan Ruan

unread,
Aug 8, 2017, 2:01:10 AM8/8/17
to SonarQube
Hi Again

I missed an important piece of information, the error only occurs when we use the following customised rule from "Track uses of disallowed classes".

Thanks
Huan


    <rule>
      <repositoryKey>squid</repositoryKey>
      <key>AvoidUsingJavaSqlDataAndTimeClassesTimestamp</key>
      <priority>INFO</priority>
      <parameters>
        <parameter>
          <key>className</key>
          <value>java.sql.Timestamp</value>
        </parameter>
      </parameters>
    </rule>

Michael Gumowski

unread,
Aug 8, 2017, 5:27:51 AM8/8/17
to Huan Ruan, SonarQube
Hey Huan,

Thanks a lot for the feedback and all the material to reproduce it. It is really appreciated!
Ticket created: SONARJAVA-2421

Cheers,
Michael

--
You received this message because you are subscribed to the Google Groups "SonarQube" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sonarqube+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/sonarqube/e2f979fd-dbb2-4723-922d-1fa453be9c82%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
Michael Gumowski | SonarSource
Software Developer, Language Team
http://sonarsource.com

Huan Ruan

unread,
Aug 8, 2017, 7:12:00 AM8/8/17
to SonarQube
Hi Michael

Many thanks for the prompt follow up. Glad to be able to help with this great product.

Cheers
Huan

Reply all
Reply to author
Forward
0 new messages