【问题标题】:Is the SonarQube Java analyser supposed to be able to analyse semantically incorrect Java source code?SonarQube Java 分析器是否应该能够分析语义不正确的 Java 源代码?
【发布时间】:2015-07-02 08:08:58
【问题描述】:

给定以下java源代码,

public class Test {
  private static int a;
  private static int a;
}

您在分析时会遇到错误,这是意料之中的吗?我觉得应该是log作为解析器失败,而不是停止分析吧?

ERROR: Error during Sonar runner execution
org.sonar.runner.impl.RunnerException: Unable to execute Sonar
    at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
    at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)
    at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)
    at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)
    at org.sonar.runner.api.Runner.execute(Runner.java:100)
    at org.sonar.runner.Main.executeTask(Main.java:70)
    at org.sonar.runner.Main.execute(Main.java:59)
    at org.sonar.runner.Main.main(Main.java:53)
Caused by: org.sonar.squidbridge.api.AnalysisException: SonarQube is unable to analyze file : '/home/administrator/tmp/frameworks/av/Test.java'
    at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:102)
    at org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:75)
    at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:131)
    at org.sonar.java.JavaSquid.scan(JavaSquid.java:124)
    at org.sonar.plugins.java.JavaSquidSensor.analyse(JavaSquidSensor.java:86)
    at org.sonar.batch.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:59)
    at org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:51)
    at org.sonar.batch.phases.DatabaseModePhaseExecutor.execute(DatabaseModePhaseExecutor.java:120)
    at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:264)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:235)
    at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:230)
    at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:220)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    at org.sonar.batch.scan.ScanTask.scan(ScanTask.java:57)
    at org.sonar.batch.scan.ScanTask.execute(ScanTask.java:45)
    at org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:135)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    at org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:158)
    at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:95)
    at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:67)
    at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:48)
    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:497)
    at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)
    ... 9 more
Caused by: java.lang.IllegalArgumentException: duplicate key: a
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
    at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:72)
    at com.google.common.collect.ImmutableMap$Builder.fromEntryList(ImmutableMap.java:221)
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:207)
    at org.sonar.java.checks.HiddenFieldCheck.visitNode(HiddenFieldCheck.java:94)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:89)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.visitChildren(SubscriptionVisitor.java:115)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:91)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.scanTree(SubscriptionVisitor.java:72)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.scanFile(SubscriptionVisitor.java:65)
    at org.sonar.java.checks.SubscriptionBaseVisitor.scanFile(SubscriptionBaseVisitor.java:33)
    at org.sonar.java.checks.HiddenFieldCheck.scanFile(HiddenFieldCheck.java:80)
    at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:123)
    at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:94)
    ... 38 more

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    此源代码无法编译,因此我们也不希望 SonarQube Java 分析器能够分析这段代码。但是错误消息应该更有意义。我创建了以下 Jira 票证:http://jira.sonarsource.com/browse/SONARJAVA-1182

    【讨论】:

    • 事情比错误信息要复杂一些。这里的堆栈跟踪表明失败是在检查期间发生的,而不是在语义分析期间(应该失败的地方)。我将更新票证并对此发表评论。
    • 是的,就是这个意思,分析这样的源代码时,你应该报告一个解析器错误,而不是停止分析。
    • @MaksonLee 不,我们绝对应该让 IMO 分析失败(这确实是这里的观点):分析不可编译的代码有什么意义?我的观点是,失败应该在分析中(在语义期间)发生得更好、更早。另请注意,这不是解析错误,这是语义问题(从语法上讲,您的代码是有效的)。
    • @benzonico,我的意思是,你的项目中有很多 Java 源代码,你应该继续分析其余部分,而不是停止分析。
    • 也就是说,你应该尽量捕捉并处理这种错误,而不是退出运行器。
    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2019-11-08
    • 2019-03-12
    相关资源
    最近更新 更多